Numpy/Pandas/DataFrame 操作总结

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()函数

  1. df.pct_change()是计算差值变化率,相当于第二个减去第一个,再除以第一个,就是第二的数据;eg:df1 = df.pct_change();pct_change(2)相当于第三个减去第一个,再除以第一个,第四个减去第二个,再除以第二个,以此类推

  2. 直接填充第一个为0,保留两位小数;eg:df2 = df.pct_change().fillna(0).applymap(lambda x:format(x, '.2f'))

  3. pd.shift函数是向下或向上移动;pd.shift(2)函数是向下或向上移动两个单位

  4. 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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值