【问题标题】:performing math on dataframe variables after groupby in pandas and bringing results back to original dataframe在 pandas 中 groupby 之后对数据帧变量执行数学运算并将结果带回原始数据帧
【发布时间】:2015-08-29 01:52:26
【问题描述】:

首先是数据:

df
   City   Date     Sex  Weight
0    A  6/12/2015   M     185
1    A  6/12/2015   F     120
2    A  7/12/2015   M     210
3    A  7/12/2015   F     105
4    B  6/12/2015   M     225
5    B  6/12/2015   F     155
6    B  6/19/2015   M     167
7    B  6/19/2015   F     121

我正在尝试减去两个权重,男性和女性。我能够对数据进行分组并选择每种性别的权重,但无法简单地创建一个新变量“wt_diff”并让“wt_diff”出现在每一行上,而不管性别如何,这样每个城市/日期/性别组都会在事实上,在同一行,两性之间的体重差异。

我希望有这个输出:

df_new
City   Date     Sex  Weight     Wt_Diff
0    A  6/12/2015   M     185     65
1    A  6/12/2015   F     120     65
2    A  7/12/2015   M     210    105
3    A  7/12/2015   F     105    105
4    B  6/12/2015   M     225     70
5    B  6/12/2015   F     155     70
6    B  6/19/2015   M     167     46
7    B  6/19/2015   F     121     46

我可以使用这个来获得重量差异:

def diffw(df):
return(np.diff(df.Weight)*-1)

gb = ['Date', 'City']
gb=df.groupby(gb).apply(diffw)

gb

Date       City
6/12/2015  A        [65]
           B        [70]
6/19/2015  B        [46]
7/12/2015  A       [105]
dtype: object

我不知道如何将 wt_diffs 恢复到每一行的原始 df。

非常感谢您的帮助。 . . 约翰

【问题讨论】:

    标签: python pandas group-by dataframe


    【解决方案1】:

    你可以使用GroupBy.transform:

    >>> f = df.groupby(['City', 'Date'])['Weight'].transform
    >>> df['Wt_Diff'] = f('max') - f('min')
    >>> df
      City       Date Sex  Weight  Wt_Diff
    0    A  6/12/2015   M     185       65
    1    A  6/12/2015   F     120       65
    2    A  7/12/2015   M     210      105
    3    A  7/12/2015   F     105      105
    4    B  6/12/2015   M     225       70
    5    B  6/12/2015   F     155       70
    6    B  6/19/2015   M     167       46
    7    B  6/19/2015   F     121       46
    

    编辑:如果max - min 不起作用,最简单的方法是先添加 signed 权重列:

    >>> df['+/-Weight'] = df['Weight'].where(df['Sex'] == 'M', -df['Weight'])
    >>> df['Wt_Diff'] = df.groupby(['City', 'Date'])['+/-Weight'].transform('sum')
    

    【讨论】:

    • 抱歉,还有一个问题。如果在同一个城市/日期,某些女性的体重超过某些男性,我将如何始终执行男性-女性(因为 max-min 不会给我 m-f)。再次感谢
    猜你喜欢
    • 2017-06-26
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    相关资源
    最近更新 更多