pandas 高级
Pandas query 的用法, df.query; 12.高性能Pandas:eval和query
Dataframe
Group-by
, Pandas 中的 df
设计思路很多;来源于SQL,毕竟SQL比pandas早好几十年出生。
df = pd.DataFrame([{'name': 'Albert', 'store': 175, 'sales': 109, 'clients': 28},
{'name': 'Sharon', 'store': 129, 'sales': 208, 'clients': 248},
{'name': 'Albert', 'store': 275, 'sales': 524, 'clients': 78},
{'name': 'Sharon', 'store': 399, 'sales': 913, 'clients': 921},
{'name': 'Sharon', 'store': 851, 'sales': 482, 'clients': 527},
{'name': 'Albert', 'store': 974, 'sales': 314, 'clients': 323},
{'name': 'Pink', 'store': 868, 'sales': 532, 'clients': 273},
{'name': 'Angelina', 'store': 4, 'sales': 31, 'clients': 347}],
)
df.groupby('name')[['sales', 'clients']].sum()
df.groupby('name').get_group('Albert')
df.groupby('name').first() # each first row of each group
df.groupby('name').last()
df.groupby('name').nth(1) # 2nd Row of each group
df.sort_values(by='sales', ascending=False, ).groupby('name').first() # Sort and get the first value of each group
df.groupby('name').groups # return dict
df.groupby('name').size() # size of group(s)
df.groupby('name').ngroups # number of group(s)
df.groupby('name').agg({'store': 'count', 'sales': 'sum', 'clients': 'mean'})
df.groupby('name').agg(['sum', 'mean'])
df.groupby('name').plot() # plot
df.groupby('name').transform(lambda x: x.fillna(x.mean())) # transform
Pandas进阶笔记 (一) Groupby 重难点总结 , 这篇博客写的很好,分析了apply
、transform
、filter
怎么使用
# 等效
df_1.set_index("date").resample("M")["ext price"].sum()
df_1.groupby(pd.Grouper(key="date", freq="M"))["ext price"].sum()
# 等效
df_1.set_index("date").groupby("name")["ext price"].resample("M").sum().head(20)
df_1.groupby(["name", pd.Grouper(key="date",freq="M")])["ext price"].sum().head(20)
groupby
中 level
的应用,grouping-dataframe-with-index-levels-and-columns
s.groupby(level=["first", "second"]).sum()
df.groupby([pd.Grouper(level=1), "A"]).sum()
如何去sort How To Sort Pandas DataFrames
df.sort_values(by=['colB', 'colC'], ascending=[True, False]) # 多列
df.sort_values(by='colC', ascending=True, na_position='first') # nan置顶
pandas, 微信推文pd.rolling 和 pandas 自带时间的联合应用。
调用 amount.rolling()
会返回一个 Rolling
对象,再调用 Rolling 对象的 sum, max, min, mean, std 等方法即可对每个窗口求总和、最大值、最小值等等。当然我们也可以调用 agg 方法,里面传入一个函数,来自定义每个窗口的计算逻辑。然后重点是,agg
里面除了接收一个函数之外,还能接收一个列表,列表里面可以有多个函数,然后同时执行多个操作。(来源于推文)
求3天内累计次数大于1k的时间,那我们根据下面 code 做一个筛选就可以啦。
amount.rolling("3D").sum()
df_assortativity.rolling(20, min_periods=1).mean()
pandas的开发者最早也是将pandas用来处理金融时间序列, 所以将日度数据转换为月度数据、季度数据都是比较常见的,或者将3列数据变成一个宽表
periods = pd.date_range(start_date, end_date, freq='Q')
pivot_nav = pd.pivot_table(fund_nav, index='day', columns='code', values='refactor_net_value')
转化成为下面数据,不存在值即为 Nan,
如果想讲宽表变回去怎么做? df,stack()
:DataFrame.stack