我的熊猫数据框中的数据如下所示:
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列中的所有数据(实际上是更多列)除以key1的4和key2的8。对于我的实际数据,我有成千上万个键和100个左右的列,我想除以键最后一个列A值。每个键的日期范围是独立的。
我知道,假设DataFrame按日期升序排序,我可以使用以下方法得到分母:
toy.groupby('key')['A'].last()
但是我不知道如何将每个键的B&C列中的值除以该值。
希望我已经明确提出问题,很高兴在必要时予以澄清
答案 0 :(得分:3)
使用 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
,将系列中的每个元素“转换”为每个组中的最后一个值。然后,我们可以简单地将每行除以等效值。
答案 1 :(得分:0)
我不确定这是否是正确的方法,但这应该会有所帮助。
toy_gby = toy.groupby('key')
keys_values = toy_gby['A'].last()
keys_df = pd.DataFrame(keys_values)
keys_df = keys_df.reset_index()
keys_df = keys_df.rename(columns = {'A':'new_column'})
merged_df = pd.merge(toy,keys_df, on =['key'])
merged_df['B'] = merged_df['B']/merged_df['new_column']
merged_df['C'] = merged_df['C']/merged_df['new_column']
我正在尝试创建一个新列,该列的值用于划分要划分的其他列。