1.pandas排序
-
按标签排序
使用sort_index方法实现按标签排序
unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],columns = ['col2','col1'])
sorted_df = unsorted_df.sort_index()
print(sorted_df) #得到一个新的df,按标签index排列
sort_index方法默认升序排序,可以传递参数ascending=False实现标签降序排序,默认ascending=True
此外,sort_index方法默认按行标签排序,可以传递参数axis=1实现列名排序,默认axis=0
-
按值排序
使用sort_values实现按值排序,它接收一个by参数,通过by参数连接的列名进行值排序
unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
sorted_df = unsorted_df.sort_values(by='col1') #按col列的值排序
print (sorted_df)
如果要实现多个列排序,可以在by参数里传入数组:by=['col1','col2'],即先按col1列的值排序,col1列相同的值再按col2列排序
此外,sort_values提供了mergesort、heapsort、quicksort三种排序算法,mergesort是唯一稳定的算法,通过kind参数指定。
2.pandas字符串操作
pandas使用python提供的字符串操作函数,因此可以先将Series转换为str,再使用python的字符串操作函数,包括如下:
s = pd.Series(['Tom', 'William Rick', 'John', 'Alber@t', np.nan, '1234','SteveMinsu'])
print (s.str.lower())
print(s.str.startswith('T'))
print(s.str.isnumeric())
3.pandas统计函数和窗口函数和聚合函数
3.1pandas统计函数
pct_change函数用于计算后一个元素与前一个元素的变化百分比,默认参数axis=0是按列值计算,可以通过传递参数axis=1计算行值的变化百分比,而且只支持数字元素,不支持字符串。
s = pd.Series([1,2,3,4,5,4])
print (s.pct_change())
df = pd.DataFrame(np.random.randn(5, 2))
print (df.pct_change())
cov协方差函数用于计算两个序列的协方差,若用于DataFrame,则计算所有列之间的协方差。
s1 = pd.Series(np.random.randn(10))
s2 = pd.Series(np.random.randn(10))
print (s1.cov(s2)) #计算两个序列的协方差
frame = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
print (frame['a'].cov(frame['b'])) #计算列a和列b的协方差
print (frame.cov()) #计算frame中所有序列两两之间的协方差
corr相关性函数用于计算两个序列的线性关系,和cov类似,若用于DataFrame,则计算所有列之间的线性关系
s1 = pd.Series(np.random.randn(10))
s2 = pd.Series(np.random.randn(10))
print (s1.corr(s2)) #计算两个序列的相关性
frame = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
print (frame['a'].corr(frame['b'])) #计算列a和列b的相关性
print (frame.corr()) #计算frame中所有序列两两之间的相关性
3.2pandas窗口函数
rolling函数可以应用于一系列数据,指定window=n参数并在其上应用适当的统计函数。
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2020', periods=10),
columns = ['A', 'B', 'C', 'D'])
print (df.rolling(window=3).mean())#表示当前元素和前两个元素的平均值,所以前两行没有平均值,为NaN
同样,expanding函数应用与一序列数据,指定min_periods = n参数并在其上应用适当的统计函数。
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2018', periods=10),
columns = ['A', 'B', 'C', 'D'])
print (df.expanding(min_periods=3).mean()) #和rolling函数效果一样
3.3pandas聚合函数
聚合函数可以运用于整个DataFrame上,也可以仅用于DataFrame某个列或某几个列,而且可以聚合多个函数,而且可以不同的列聚合不同的函数
df = pd.DataFrame(np.random.randn(10, 4),
index = pd.date_range('1/1/2000', periods=10),
columns = ['A', 'B', 'C', 'D'])
r = df.rolling(window=3,min_periods=1)
print r.aggregate(np.sum) #整个DataFrame,一个聚合函数
print (r[['A','B']].aggregate(np.sum))#多个列,一个聚合函数
print (r['A'].aggregate([np.sum,np.mean]))#单个列,多个聚合函数
print (r.aggregate({'A' : np.sum,'B' : np.mean}))#不同的聚合函数对应于不同的列
4.pandas缺失数据处理(NaN)
pandas提供isnull和notnull函数检测值是否缺失。
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print (df['one'].isnull()) #检测列one是否为Nan值
print (df['one'].notnull()) #检测列one是否不为Nan值
fillna函数提供几种方法用非空值填充NaN值
df = pd.DataFrame(np.random.randn(3, 3), index=['a', 'c', 'e'],columns=['one',
'two', 'three'])
df = df.reindex(['a', 'b', 'c'])
print (df.fillna(0)) #用0替换NaN值
类似于reindex_like中的method参数,fiilna提供method参数来控制向前或向后填充:pad/fill为向前填充,bfill/backfill为向后填充
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print (df.fillna(method='pad')) #向前填充
print (df.fillna(method='backfill')) #向后填充
dropna函数用于删除有NaN值的行或列,默认参数axis=0为删除行,可以通过传递参数axis=1删除有NaN值的列
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print (df.dropna())
print (df.dropna(axis=1))
replace方法用于替换序列或DataFrame中元素的值
s = pd.Series(np.arange(10))
print(s.replace({0:9,1:8})) #序列中的元素替换
df = pd.DataFrame({'one':[10,20,30,40,50,2000],'two':[1000,0,30,40,50,60]})
print (df.replace({1000:10,2000:60}))#DataFrame中的元素替换
5.pandas分组
pandas有多种方法来拆分对象:
df.groupby(key1)
df.groupby([key1, key2])
df.groupby(key1,axis=1)
上述方法都会生成一个group分组对象,要想查看分组内容,可以再调用groups函数:
df.groupby(key1).groups #将返回每个分组所包含的内容,可能包含多行或者一行
也可以直接用for循环遍历group对象
另外,用get_group方法可以选择一个分组,比如
df.groupby('year').get_group(2014) #记录按年分组,并选择2014年的分组
在分组对象做聚合操作,比如
df.groupby('year')['points'].agg(np.mean)
df.groupby('year')['points'].agg([np.mean, np.sum, np.std]) #一次聚合多个函数
用filter方法对分组对象过滤,比如
df.groupby('Team').filter(lambda x: len(x) >= 3)
6.pandas连接和合并
pandas连接和合并与SQL类似,分为left right outer inner连接,默认为inner连接。通过merge方法实现:
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True)
参数说明:
how参数的取值说明:
连接方式 | 说明 |
---|---|
left | 使用左侧对象的键 |
right | 使用右侧对象的键 |
outer | 使用键的并集 |
inner | 使用键的交集 |
import pandas as pd
left = pd.DataFrame({
'id':[2,3,4,5,6],
'Name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],
'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame(
{'id':[1,2,4,5,7],
'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
'class_id':['class2','class4','class3','class6','class5']})
print(pd.merge(left, right, on='id')) #inner连接
print(pd.merge(left, right, on='id', how='left')) #left连接
print(pd.merge(left, right, on='id', how='right')) #right连接
print(pd.merge(left, right, on='id', how='outer')) #outer连接
7.稀疏数据
当数据中存在大量Nan值时,可以采用to_sparse方法稀疏数据,以提高内存效率,同样可以采用to_dense方法将稀疏对象转换为标准密集模式。
ts = pd.Series(np.random.randn(10))
ts[2:-2] = np.nan
sts = ts.to_sparse()
print (sts.to_dense())