1 DataFrame操作
1.1 聚合
groupby:
agg:可以针对具体的列实现不同的操作,可以传{‘col1’:‘max’,‘col2’:‘first’,‘col3’:‘count’}
apply:对分块进行处理;
rolling函数是pandas库中的一个函数,用于对时间序列数据进行移动窗口计算。它可以计算指定区间内的均值、标准差、最大值、最小值等。
df = df.groupby('OrderID').agg({'UNIX': 'first',
'OrderPrice': 'first', 'Balance': 'sum'}).reset_index()
# agg(’新列名‘=(’原列名‘, ’统计函数/方法‘))
df = df.groupby('OrderID').agg(u=('UNIX', 'first'),
o=('OrderPrice', 'first'), b=('Balance', 'sum')).reset_index()
# transform
student['score_mean'] = student.groupby('class')['score'].transform('mean')
# rolling
df_temp2_3y['ROE_MEAN'] = df_temp2_3y.groupby('S_INFO_WINDCODE'
).S_FA_ROE.transform(lambda x: x.rolling(3).mean())
import pandas as pd
# 创建一个时间序列数据
data = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# 计算过去3个数据的平均值
data.rolling(3).mean()
# 计算过去5个数据的标准差
data.rolling(5).std()
1.2 排序
df[df.Balance > 0][['OrderPrice', 'UNIX', 'OrderID', 'Balance']]
.groupby(['OrderPrice', 'UNIX'])
.agg({'OrderID': 'count', 'Balance': 'sum'})
.reset_index()
.sort_values(by=['OrderPrice', 'UNIX'], ascending=(False, True))
1.3 输出列排序序号
df['rank']=df['amount'].rank(ascending=0, method='first')
说明:ascending :1 表示升序,0表示降序
method :此参数的作用是,当遇到两个值相同时,排序处理的方式。可以取的值有 first、max、min、dense
(1) method =‘first’ 时 :表示排序时,序号不会重复且是连续的,遇到相同的值时,会按照数据的先后顺序标序号
(2)method='min’时:表示排序时,遇到相同的值时,后面数的序号与最先出现的数的序号保持一致,如下图,843.86值重复两次,排名均为9,且排序中没有序号10(序号不连续)
(3)method='max’时:表示排序时,遇到相同的值时,后面数的序号与最后出现的数的序号保持一致,如下图,843.86值重复两次,排名均为10,且排序中没有序号9(序号不连续)
(4)method='dense’时:表示排序时,遇到相同的值时,重复值序号保持一致,如下图,843.86值重复两次,排名均为9,且下一个数序号为10,序号保持连续
1.4 条件筛选/赋值
pm_t = pm[(pm.user_name == manager) &
(pm.begin_date <= analysis_date) &
(pm.end_date >= analysis_date)]
eg:对 score 列条件赋值,data为DataFrame;
使用如下语法:data[data.id == 5].score = 10 ,但是运行之后会发现,该列的数值并没有被修改。
这是应为你通过id进行赛选数据之后再取score 的时候,此时变量已经不是在操作原来的那张表了,而是在操作一个新的变量data[data.id == 5],因此无法进行赋值。
正确做法:
一、通过切片的方式进行赋值:
思路:首先data[data.id == 5]将数据取出来,然后在取该变量的index,data[data.id==5].index,注意此时数据类型为Int64Index格式,如下,为此我们将其转换成列表,data[data.id ==5].index.tolist(),此时就获取了所有该id的索引值;
获取所有的index之后我们就可以使用loc函数了:如下:
data.loc[data[data.id == 5].index.tolist(),‘score ’] = 10。
二、使用相同长度的list进行对其修改:
data.loc[data[data.id == 5].index.tolist(),‘score ’] = [10, 10, 10]
三、通过切片对连续数据进行修改:如下
如,我要将前面连续4组数据修改为1,2,3,4:我们可以这样使用
data[:4].score = [1,2,3,4]
1.5 映射字典/增加新列 map
a = [['a', 1, 2], ['b', 21, 22], ['c', 31, 32]]
b = pd.DataFrame(a, columns=['code', 'v1', 'v2'])
print(b)
# 创建字典,列映射
c = b.set_index('code').v1.to_dict()
print(c) # c = {'a': 1, 'b': 21, 'c': 31}
b['c1'] = b.code.map(c) # 添加新列
print(b)
1.6 pct_change()、diff()、shift()函数
-
df.pct_change()是计算差值变化率,相当于第二个减去第一个,再除以第一个,就是第二的数据;eg:df1 = df.pct_change();pct_change(2)相当于第三个减去第一个,再除以第一个,第四个减去第二个,再除以第二个,以此类推
-
直接填充第一个为0,保留两位小数;eg:df2 = df.pct_change().fillna(0).applymap(lambda x:format(x, '.2f'))
-
pd.shift函数是向下或向上移动;pd.shift(2)函数是向下或向上移动两个单位
-
diff函数是相差;diff(1)下一行减去上一行;diff(2)下一行减去上两行,如第三行减去第一行;diff(-1)上一行减去下一行;
2 numpy操作
2.1 矢量操作
a = numpy.array([1, 2, 3, 4, 7, 9])
b = a / 10 + 1
# b = [1.1, 1.2, 1.3, 1.4, 1.7, 1.9]
2.2 累加操作
cumsum(), cumprod(), cummax()