2016-03-03 20 views
4

我有以下的玩具数据框(真正的人有50万行):熊猫:指派GROUPBY的结果数据框到一个新的列

df = pd.DataFrame({'size': list('SSMMMLS'), 
        'weight': [8, 10, 11, 1, 20, 14, 12], 
        'adult' : [False] * 5 + [True] * 2}) 

    adult size weight 
0 False S  8 
1 False S  10 
2 False M  11 
3 False M  1 
4 False M  20 
5 True L  14 
6 True S  12 

而想要GROUPBY adult,选择weight是行最大,并在新的列分配size2size列值:

adult size size2 weight 
0 False S  S  8 
1 False S  S  10 
2 False M  S  11 
3 False M  S  1 
4 False M  S  20 
5 True L  L  14 
6 True S  L  12 

我发现this,但它不适合我

工作

到目前为止,我有:

df.loc[:, 'size2'] = df.groupby('adult',as_index=True)['weight','size'] 
         .transform(lambda x: x.ix[x['weight'].idxmax()]['size']) 
+1

我不明白你想要什么。你需要一个新的'size2'列和'size2'列中的值...... – bozdoz

回答

3

IIUC可以使用merge。我认为size2的第一个值是M,因为最大weight20

df = pd.DataFrame({'size': list('SSMMMLS'), 
        'weight': [8, 10, 11, 1, 20, 14, 12], 
        'adult' : [False] * 5 + [True] * 2}) 

print df 
    adult size weight 
0 False S  8 
1 False S  10 
2 False M  11 
3 False M  1 
4 False M  20 
5 True L  14 
6 True S  12 

print df.groupby('adult').apply(lambda subf: subf['size'][subf['weight'].idxmax()]).reset_index(name='size2')     
    adult size2 
0 False  M 
1 True  L 

print pd.merge(df, df.groupby('adult').apply(lambda subf: subf['size'][subf['weight'].idxmax()]).reset_index(name='size2'), on=['adult'])    
    adult size weight size2 
0 False S  8  M 
1 False S  10  M 
2 False M  11  M 
3 False M  1  M 
4 False M  20  M 
5 True L  14  L 
6 True S  12  L 
1

你可以使用transformlocvalues

>>> df["size2"] = df["size"].loc[df.groupby("adult")["weight"].transform("idxmax")].values 
>>> df 
    adult size weight size2 
0 False S  8  M 
1 False S  10  M 
2 False M  11  M 
3 False M  1  M 
4 False M  20  M 
5 True L  14  L 
6 True S  12  L 

一步一步,首先要找到合适的指标:

>>> df.groupby("adult")["weight"].transform("idxmax") 
0 4 
1 4 
2 4 
3 4 
4 4 
5 5 
6 5 
dtype: int64 

然后我们使用这些索引到sizeloc

>>> df["size"].loc[df.groupby("adult")["weight"].transform("idxmax")] 
4 M 
4 M 
4 M 
4 M 
4 M 
5 L 
5 L 
Name: size, dtype: object 

最后,我们采取.values,使指数不当我们尝试分配时,请按方式进行:

>>> df["size"].loc[df.groupby("adult")["weight"].transform("idxmax")].values 
array(['M', 'M', 'M', 'M', 'M', 'L', 'L'], dtype=object) 
>>> df["size2"] = df["size"].loc[df.groupby("adult")["weight"].transform("idxmax")].values 
>>> df 
    adult size weight size2 
0 False S  8  M 
1 False S  10  M 
2 False M  11  M 
3 False M  1  M 
4 False M  20  M 
5 True L  14  L 
6 True S  12  L