python - Pandas Groupby 按唯一键除以序列中的最后一个

标签 python pandas

我的 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/

相关文章:

python - 如何使用 opencv 和 python 获取 Gstreamer 直播流?

Python字符串编码问题

python - 向元素添加注释并使元素文本出现在注释之后

python - 使用分区计算 Pandas 中条目之间的增量

pandas - 根据日期列 Pandas 过滤数据框

python - 从DDFS读取数据ValueError : No JSON object could be decoded

python - 如何使用 python 在 MongoDB 中创建模式?

python - 编写这个 for 循环的更有效方法?

python - 在保留原始数据的条件下从 Pandas dataFrame 中删除重复项

python - 选择 Pandas 数据框中特定列中具有空列表的行