pandas学习笔记01

pandas的基础使用
从 CSV 文件中读取数据

这个数据集是一个列表,蒙特利尔的 7 个不同的自行车道上每天有多少人。

broken_df = pd.read_csv('../data/bikes.csv')

# 查看前三行

broken_df[:3]

你可以看到这完全损坏了。 read_csv  拥有一堆选项能够让我们修复它,在这里我们:

将列分隔符改成 ;

将编码改为 latin1(默认为 utf-8)

解析Date列中的日期

告诉它我们的日期将日放在前面,而不是月

将索引设置为 Date

fixed_df = pd.read_csv('../data/bikes.csv',  sep=' ; ' ,  encoding='latin1', parse_dates=['Date'], dayfirst=True, index_col='Date')

fixed_df[:3]

从SQL库读取数据

read_sql需要2个参数: SELECT语句, 数据库连接对象。

import sqlite3

con = sqlite3.connect("../data/weather_2012.sqlite")

df = pd.read_sql("SELECT * from weather_2012 LIMIT 3", con)

选择一列,并绘制

当你读取 CSV 时,你会得到一种称为 DataFrame  的对象,它由行和列组成。 您

从数据框架中获取列的方式与从字典中获取元素的方式相同。

fixed_df['Berri 1'].plot()

直接输出表对象

complaints = pd.read_csv('../data/311-service-requests.csv')

当你查看一个大型数据框架,而不是显示数据框架的内容,它会显示一个摘要。这包括所有列,以及每列中有多少非空值。

如直接输出 complaints

查找多列,多行,子集

查看每列的类型:

df.dtypes

查找多列,列索引必须要用中括号扩起来

complaints[['Complaint Type', 'Borough']][:10]

查找多行,这里的ix索引标签函数必须是中括号[]

student.ix[[0,2,4,5,7]]

查找多列,通过ix索引标签查询指定的列

student.ix[ : , ['Name','Height','Weight']]

查询出所有12岁以上的女生姓名、身高和体重

student[(student['Sex']=='F') & (student['Age']>12)][['Name','Height','Weight']]

查看某列中各个种类出现的次数

complaints['Complaint Type'].value_counts()

查看某列中属于某个种类的数据

为了得到噪音投诉,我们需要找到 Complaint Type  列为 Noise -Street/Sidewalk  的行。 我会告诉你如何做,然后解释发生了什么。

noise_complaints = complaints[complaints['Complaint Type'] == "Noise - Street/Sidewalk"]

将多个条件与 & 运算符组合

is_noise = complaints['Complaint Type'] == "Noise - Street/Sidewalk"

in_brooklyn = complaints['Borough'] == "BROOKLYN"

complaints[is_noise & in_brooklyn][:5]

转为numpy数组类型

pd.Series([1,2,3]).values

常用函数

1)对字符串切片操作

requests['某列'] = requests['某列'].str.slice(0,5)

2)为每列添加前缀

df.add_prefix('mean_')

排序

1)将一列排序

Table[[‘某列’]].sort()

2)将多列按照某一列排序

table[['列1', '列2', '列3']].sort('列1')

3)值排序一般使用sort_values()

Student.sort_values(by = [‘sex’, ‘age’])

解析Unix时间戳

pandas 中的时间戳解析的神奇部分是 numpy  datetime  已经存储为 Unix 时间戳。 所以我们需要做的是告诉 pandas 这些整数实际上是数据时间,它不需要做任何转换。

我们需要首先将这些转换为整数,然后我们可以使用 pd.to_datetime函数将我们的整数时间戳转换为 datetimes。这是一个常量时间操作,我们实际上并不改变任何数据,只是改变了 Pandas 如何看待它。

popcon['atime'] = popcon['atime'].astype(int)

popcon['atime'] = pd.to_datetime(popcon['atime'], unit='s')

统计分析函数

d1.count() #非空元素计算

d1.min() #最小值

d1.max() #最大值

d1.idxmin() #最小值的位置,类似于R中的which.min函数

d1.idxmax() #最大值的位置,类似于R中的which.max函数

d1.quantile(0.1) #10%分位数

d1.sum() #求和

d1.mean() #均值

d1.median() #中位数

d1.mode() #众数

d1.var() #方差

d1.std() #标准差

d1.mad() #平均绝对偏差

d1.skew() #偏度

d1.kurt() #峰度

d1.describe() #一次性输出多个描述性统计指标

关于相关系数的计算可以调用pearson方法或kendell方法或spearman方法,默认使用pearson方法。计算的是任意两列的相关系数。

df.corr()

如果只想关注某一个变量与其余变量的相关系数的话,可以使用corrwith,如下方只关心x1与其余变量的相关系数:

df.corrwith(df['x1'])

数值型变量间的协方差矩阵

df.cov()

groupby
1)选择一个列或者一组列

l  对一张表直接进行分组操作,而不做其他聚合,显示结果如下:

Out[29]: df.groupby('key1')

<pandas.core.groupby.DataFrameGroupBy object at 0x000002BB1364A4A8>

如何显示:

(1)可以对分组进行迭代显示:

for name, group in df.groupby('key1'):

    print(name)

print(group)

>>> 

a

      data1     data2 key1 key2

0 -0.204708  1.393406    a  one

1  0.478943  0.092908    a  two

4  1.965781  1.246435    a  one

-------

b

      data1     data2 key1 key2

2 -0.519439  0.281746    b  one

3 -0.555730  0.769023    b  two

-------

(2)转化为字典显示

dict(list(df.groupby('key1')))

>>> 

{'a': 

          data1     data2         key1   key2

      0    -0.204708     1.393406    a       one

1    0.478943       0.092908    a      two

4    1.965781      1.246435    a      one ,

'b':  

       data1     data2           key1   key2

      2     -0.519439   0.281746     b    one

      3     -0.555730   0.769023     b    two }

l  按每列的数据类型分组

grouped = df.groupby(df.dtypes, axis=1)

dict(list(grouped))

{dtype('float64'):       data1     data2

 0 -0.204708  1.393406

 1  0.478943  0.092908

 2 -0.519439  0.281746

 3 -0.555730  0.769023

 4  1.965781  1.246435 ,

dtype('O'):               key1  key2

 0    a  one

 1    a  two

 2    b  one

                            3    b  two

 4    a  one  }

2)通过字典或series进行分组

假如一张表的列名:columns=['a', 'b', 'c', 'd', 'e']

定义一个字典:mapping = {'a': 'red',  'b': 'red',  'c': 'blue',  'd': 'blue',  'e': 'red',  'f' : 'orange'}

by_column = people.groupby(mapping, axis=1)

by_column.sum()

>>> 

           blue       red

Joe     0.503905  1.063885

Steve   1.297183  -1.553778

Wes    -1.021228  -1.116829

Jim     0.524712  1.770545

Travis  -4.230992  -2.405455

map_series = Series(mapping)

people.groupby(map_series, axis=1).count()

3)按行进行分组

本质上还是按列进行聚合,即按照索引进行聚合,同按列进行分组

key=['ss','kk','kk','ss','ss']  #给定index分组标记

data.groupby(key).mean()  #mean是按key做分组的列均值  groupby(key)默认axis=0

4)数据的聚合

(1) quantile

df=

      data1     data2   key1 key2

0  -0.204708  1.393406    a  one

1  0.478943   0.092908    a  two

2  -0.519439  0.281746    b  one

3  -0.555730  0.769023    b  two

4  1.965781   1.246435    a  one

grouped = df.groupby('key1')

grouped['data1'].quantile(0.9)

(2)agg()

grouped = df.groupby('key1')

def peak_to_peak(arr):

    return arr.max() - arr.min()

grouped.agg(peak_to_peak)

>>> 

         data1     data2

key1                   

a     2.170488  1.300498

b     0.036292  0.487276

Tip:

agg()和apply()区别

agg函数内调用的函数只能对分组进行聚合使用,apply的应用更广泛

agg()使用的多种形式:

grouped_pct.agg(['mean', 'std', peak_to_peak])

grouped_pct.agg([('foo', 'mean'), ('bar', np.std)])  #给计算结果一个别名

functions = ['count', 'mean', 'max']

result = grouped['tip_pct', 'total_bill'].agg(functions)  #列表形式

ftuples = [('Durchschnitt', 'mean'), ('Abweichung', np.var)]

grouped['tip_pct', 'total_bill'].agg(ftuples)  #元组形式

grouped.agg({'tip' : np.max, 'size' : 'sum'})  #字典形式

grouped.agg({'tip_pct' : ['min', 'max', 'mean',  'std'], 'size' : 'sum'})  #混合形式

(3)transform()

我们经常在groupby之后使用aggregate , filter 或 apply来汇总数据,transform则不对数据进行聚合,它会在对应行的位置生成函数值。

举例:

data=

       a  b  c  d   e

li      1  2  3  4   5

chen   2  1  1  2   2

wang   1  2  3  4  5

zhao   2  1  1  2   2

qian   1  2  3  4   5

l  使用一般函数,会对数据进行聚合

key=['ss','kk','kk','ss','ss']  #给定index分组标记

print(data.groupby(key).mean())  #mean是按key做分组的列均值

>>> 

           a         b         c         d    e

kk     1.500000  1.500000  2.000000  3.000000  3.5

ss      1.333333  1.666667  2.333333  3.333333  4.0

l  使用transform(),不会对数据进行聚合

data.groupby(key).transform(np.mean)

#data里每个位置元素取对应分组列的均值

>>> 

             a         b         c         d    e

li        1.333333  1.666667  2.333333  3.333333  4.0

chen     1.500000  1.500000  2.000000  3.000000  3.5

wang    1.500000  1.500000  2.000000  3.000000  3.5

zhao     1.333333  1.666667  2.333333  3.333333  4.0

qian     1.333333  1.666667  2.333333  3.333333  4.0

5)数据透视表

假设我想要根据sex和smoker计算分组平均数(pivot_table的默认聚合类型),并将sex和smoker放到行上:

# 方法一:使用groupby

tips.groupby(['sex', 'smoker']).mean()

# 方法二:使用pivot_table

tips.pivot_table(row=['sex', 'smoker'])

两种方法是一样的

现在假设我们只想聚合tip_pct和size,而且想根据day进行分组。我将smoker放到列上,把day放到行上:

tips.pivot_table(values=['tip_pct', 'size'], index=['sex', 'day'], columns='smoker')

要使用其他的聚合函数,将其传给参数aggfunc即可。例如,使用count或len可以得到有关分组大小的交叉表:

tips.pivot_table('tip_pct',  index=['sex', 'smoker'],  columns='day',  aggfunc=len,  margins=True)

6)交叉表

交叉表crosstab()是一种特殊的pivot_table(),专用于计算分组频率

下面两种方法是一样的

data.pivot_table(index=['Gender'], columns='Handedness', aggfunc=len, margins=True)

# 方法二:用crosstab

pd.crosstab(data.Gender, data.Handedness, margins=True)

猜你喜欢

转载自www.cnblogs.com/yongfuxue/p/10032413.html
今日推荐