Pandas玩转数据
一、排序功能
0x1 Series的排序
s1 = Series(np.random.randn(10))
s2 = s1.sort_values(ascending=False) # 按照值降序排列
s2.sort_index() # 按照索引升序排列
0x2 Dataframe的排序
df1 = DataFrame(np.random.randn(40).reshape(8,5), columns=['A','B','C','D','E'])
df1['A'].sort_values() # 升序排列A列,返回一个Series
f2 = df1.sort_values('A') # 按照A列顺序排列,返回一个Dataframe
df2.sort_index() # 按照索引排列
二、Index重命名
df1 = DataFrame(np.arange(9).reshape(3,3), index=['BJ','SH','GZ'], columns=['A','B','C'])
df1.index = Series(['bj','sh','gz']) # 通过series重命名
df1.index = df1.index.map(str.upper) # 通过map函数重命名
df1.rename(index=str.lower, columns=str.lower) # 返回一个新Dataframe
df1.rename(index={'BJ': 'beijing'}, columns={"A":'a'}) # 通过字典重命名
写自己的Map函数
def test_map(x):
return x + '_ABC'
df1.index.map(test_map) # 调用函数重命名
df1.rename(index=test_map)
三、Merge操作
df1 = DataFrame({'key':['X','Y','Z','X'], 'data_set_1':[1,2,3,4]})
df2 = DataFrame({'key':['X','B','C'], 'data_set_2':[4,5,6]})
pd.merge(df1,df2)
pd.merge(df1,df2,on=None)
on参数可以指定merge的列名,没有on参数意思为on=None
dataframe的merge是按照两个dataframe共有的column进行连接,两个dataframe必须具有同名的column。 如果两个dataframe的column都不相同,则会在merge的时候报错。
而当两个dataframe具有相同的column时,若两个column中没有相同的value,则会merge一个空的dataframe。
how参数用于指定merge时的操作。
pd.merge(df1,df2, on='key',how='inner')
指定how=left,就是让df1保留所有的行列数据,df2根据df1的行列进行补全。同理,right也可以指定。outer就是how指定为left和right的结果的集合
pd.merge(df1, df2, on='key', how='left')
pd.merge(df1,df2, on='key', how='right')
pd.merge(df1,df2, on='key', how='outer')
四、Concatenate和Combine操作
0x1 Concatenate 连接
Series中矩阵(array)的连接
最终形成一个新的矩阵,大小为3列6行。其实就是将arr2连接到了arr1的下面。
更改连接方式
其中有一个参数:axis,默认为0,表示按列连接(增加行数),即将第二个矩阵的列依次连接到第一个矩阵的列的下面。如果axis=1,表示按行连接(增加列数)。
Series的连接
注意,这里使用的是pandas的方法concat,因为上边使用的numpy的concatenate方法不能讲index进行连接,只能连接values,如下:
更改连接方式
同样的,也有一个axis的参数,默认为0。当指定axis=1时,将增加列,即将形成一个dataframe,没有的值将会填充为NaN
Dataframe的连接
没有值的地方将会填充为NaN
0x2 Combine 填充,补充
从结果可看出,s1用s2中的值填充了其中对应为NaN的值。