熊猫Groupby按唯一键按顺序排在最后

时间:2018-07-09 21:42:26

标签: python 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列中的所有数据(实际上是更多列)除以key1的4和key2的8。对于我的实际数据,我有成千上万个键和100个左右的列,我想除以键最后一个列A值。每个键的日期范围是独立的。

我知道,假设DataFrame按日期升序排序,我可以使用以下方法得到分母:

toy.groupby('key')['A'].last()

但是我不知道如何将每个键的B&C列中的值除以该值。

希望我已经明确提出问题,很高兴在必要时予以澄清

2 个答案:

答案 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']

我正在尝试创建一个新列,该列的值用于划分要划分的其他列。