python - 如何使用pandas根据分组数据减去一列的行?
问题描述
我正在尝试根据第一个和最后一个日期按组计算列的行之间的差异。例如:
df = pd.DataFrame({'ID':["a","a","a","b","b","b"],
'start_yr':[2010,2013,2020,2009,2005,2019],
'amt':[10,40,30,50,60,100]})
应该返回
a 20 (30-10)
b 40 (100 - 60)
我试过这样的东西,但我肯定错过了一些东西。
#df['diff'] = df.groupby('ID')['start_yr','amt'].transform(lambda x: (x.max()-x.min()))
df['diff'] = dThe f.groupby('ID')['start_yr'].transform(lambda x: (x.max()-x.min()))
解决方案
首先对两列进行排序DataFrame.sort_values
,然后用 中的第一个值减去最后一个GroupBy.agg
:
df1 = (df.sort_values(['ID','start_yr'])
.groupby('ID')['amt']
.agg(lambda x: (x.iat[-1]-x.iat[0]))
.reset_index())
或用聚合GroupBy.first
和减去值GroupBy.last
:
df = df.sort_values(['ID','start_yr'])
g = df.groupby('ID')['amt']
df1 = g.last().sub(g.first()).reset_index()
或者对于第一个和最后一个值是可能的使用DataFrame.drop_duplicates
:
df = df.sort_values(['ID','start_yr'])
df1 = (df.drop_duplicates('ID', keep='last').set_index('ID')['amt']
.sub(df.drop_duplicates('ID').set_index('ID')['amt'])
.reset_index())
print (df1)
ID amt
0 a 20
1 b 40
编辑:这是一个想法,无需先按索引(此处)按最小值和最大值对值进行排序:DataFrameGroupBy.idxmax
DataFrameGroupBy.idxmin
amt
start_yr
g = df.set_index('amt').groupby('ID')['start_yr']
s = g.idxmax().sub(g.idxmin()).reset_index()
print (s)
ID start_yr
0 a 20
1 b 40
推荐阅读
- json - 使用 jq 和命令行参数从 JSON 对象中获取字段
- matlab - 在 Matlab 文本窗口(uicontrol)上自动向下滚动
- docker - 在同一个 dockerfile 中导入基础镜像两次
- r - 从列表中取出向量的最后一个元素并从中创建一个新向量
- javascript - 如果表到达断点,DataTables如何禁用请求
- java - 当我创建可执行 Jar 时程序卡住了
- javascript - tizen 电视日志 - 如何访问它们?
- rust - 理解 Rust 函数参数类型声明
- raspberry-pi - WSO2 IOT 服务器与代理断开连接
- c++ - cpp中的结构中的运算符重载