【问题标题】:Pandas: Calculate Median of Group over ColumnsPandas:计算列组的中位数
【发布时间】:2016-05-17 15:43:02
【问题描述】:

给定以下数据框:

import pandas as pd

df = pd.DataFrame({'COL1': ['A', 'A','A','A','B','B'], 
                   'COL2' : ['AA','AA','BB','BB','BB','BB'],
                   'COL3' : [2,3,4,5,4,2],
                   'COL4' : [0,1,2,3,4,2]})
df
    COL1    COL2    COL3    COL4
0    A       AA      2       0
1    A       AA      3       1
2    A       BB      4       2
3    A       BB      5       3
4    B       BB      4       4
5    B       BB      2       2

我希望尽可能高效地(即通过 groupby 和 lambda x 或更好)找到第 1 列和第 2 列的每个不同组的第 3 列和第 4 列的中位数。

想要的结果如下:

    COL1    COL2    COL3    COL4  MEDIAN
0    A       AA      2       0    1.5
1    A       AA      3       1    1.5
2    A       BB      4       2    3.5
3    A       BB      5       3    3.5
4    B       BB      4       4    3
5    B       BB      2       2    3

提前致谢!

【问题讨论】:

  • 到目前为止,只是这样:df['MEDIAN']=df.groupby(['COL1','COL2'])[['COL3','COL4']].transform(lambda x: x.median())

标签: python-3.x pandas


【解决方案1】:

您已经有了这个想法——按 COL1 和 COL2 分组并计算中位数。

m = df.groupby(['COL1', 'COL2'])[['COL3','COL4']].apply(np.median)
m.name = 'MEDIAN'

print df.join(m, on=['COL1', 'COL2'])

  COL1 COL2  COL3  COL4  MEDIAN
0    A   AA     2     0     1.5
1    A   AA     3     1     1.5
2    A   BB     4     2     3.5
3    A   BB     5     3     3.5
4    B   BB     4     4     3.0
5    B   BB     2     2     3.0

【讨论】:

  • 谢谢!如果我有一些 NaN 值怎么办?我怎样才能让它忽略那些而不导致 NaN 结果(就像应用了您的解决方案的当前 NaN 值的情况一样)?
  • 使用np.nanmedian 而不是np.median
  • 是的!太简单。再次感谢。
  • @Happy001 df.groupby(['COL1', 'COL2'])[['COL3','COL4']].median() 也可以。
  • 花了 15 分钟搜索互联网来解决这个问题。 Happy001,您先生是真正的绅士和学者。
【解决方案2】:
df.groupby(['COL1', 'COL2']).median()[['COL3','COL4']]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 2020-03-12
    相关资源
    最近更新 更多