我的 pandas 数据框中的数据如下所示:
In [1]: import pandas as pd
In [2]: toy = pd.DataFrame({'Date':['7/1/2018','7/2/2018','7/3/2018','7/4/2018','7/2/2018','7/3/2018','7/4/2018','7/5/2018'],
'A':[1,2,3,4,5,6,7,8],'B':[8,7,6,5,4,3,2,1],'C':[4,7,2,6,4,2,2,1],
'key':['key1','key1','key1','key1','key2','key2','key2','key2']})
In [3]: toy
Out[3]:
A B C Date key
0 1 8 4 7/1/2018 key1
1 2 7 7 7/2/2018 key1
2 3 6 2 7/3/2018 key1
3 4 5 6 7/4/2018 key1
4 5 4 4 7/2/2018 key2
5 6 3 2 7/3/2018 key2
6 7 2 2 7/4/2018 key2
7 8 1 1 7/5/2018 key2
In [4]: toy.groupby('key')['A'].last()
Out[4]:
key
key1 4
key2 8
Name: A, dtype: int64
对于每个唯一键,我想返回 A 列中最近日期的值。因此,对于 key1,最近一天是 7/4/2018,A 列中的值为 4;对于 key2,最近一天是 7/5/2018,A 列中的值为 8。
然后我想将 B 列和 C 列(实际上还有更多列)中的所有数据除以 4(如果 key1)和 8(如果 key2)。对于我的实际数据,我有数千个键和 100 个左右的列,我想除以键最后列 A 值。每个键的日期范围都是独立的。
我知道,假设 DataFrame 按日期升序排序,我可以使用以下方法获得分母:
toy.groupby('key')['A'].last()
但我不知道如何将每个键的每列 B 和 C 中的值除以该值。
希望我已经清楚地阐述了问题,很乐意根据需要进行澄清
最佳答案
使用 transform('last')
代替 last
,然后简单地除以:
df[['B', 'C']].div(df.groupby('key').A.transform('last'), axis=0)
B C
0 2.000 1.000
1 1.750 1.750
2 1.500 0.500
3 1.250 1.500
4 0.500 0.500
5 0.375 0.250
6 0.250 0.250
7 0.125 0.125
要说明为什么它有效:
df.groupby('key').A.transform('last')
0 4
1 4
2 4
3 4
4 8
5 8
6 8
7 8
Name: A, dtype: int64
通过使用 transform('last')
而不是 last
,系列中的每个元素都是“转换”为每组中的最后一个值。然后我们可以简单地将每一行除以该结果中的等效值。
关于python - Pandas Groupby 按唯一键除以序列中的最后一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51254431/