【问题标题】:Python Pandas: Aggregate rows conditional value pickingPython Pandas:聚合行条件值选取
【发布时间】:2018-02-19 13:00:48
【问题描述】:

我有一个这样的数据框:

df = pd.DataFrame({'dim': {0: 'A', 1: 'B', 2: 'A', 3: 'B', 4: 'A'},
                   'id': {0: 1, 1: 1, 2: 2, 3: 2, 4: 3},
                   'value1': {0: nan, 1: 1.2, 2: 2.0, 3: nan, 4: 3.0},
                   'value2': {0: 1.0, 1: 2.0, 2: nan, 3: nan, 4: nan}})

  dim  id  value1  value2
0   A   1     NaN     1.0
1   B   1     1.2     2.0
2   A   2     2.0     NaN
3   B   2     NaN     NaN
4   A   3     3.0     NaN

我现在想在 id 上聚合不同维度的值,以便以下情况成立: 如果 dim == 'A' 不是 None 则取 dim == 'A' 的值,否则取 dim == 'B' 的值(如果它不是 None)。如果两者都是None,就取None。

所以结果应该是:

   id  value1  value2
0   1     1.2     1.0
1   2     2.0     NaN
2   3     3.0     NaN

我的猜测是,我需要使用某种形式的按功能分组,但我不太确定。也许有什么应用?

【问题讨论】:

    标签: python pandas numpy python-3.5


    【解决方案1】:

    您可以使用set_indexunstackswaplevel 进行整形,然后使用combine_first

    df1 = df.set_index(['id','dim']).unstack().swaplevel(0,1,axis=1)
    #alternative
    #df1 = df.pivot('id','dim').swaplevel(0,1,axis=1)
    print (df1)
    dim      A      B      A      B
        value1 value1 value2 value2
    id                             
    1      NaN    1.2    1.0    2.0
    2      2.0    NaN    NaN    NaN
    3      3.0    NaN    NaN    NaN
    
    df2 = df1['A'].combine_first(df1['B']).reset_index()
    print (df2)
       id  value1  value2
    0   1     1.2     1.0
    1   2     2.0     NaN
    2   3     3.0     NaN
    

    xs 类似的解决方案选择MultiIndex

    df1 = df.set_index(['id','dim']).unstack()
    #alternative
    #df1 = df.pivot('id','dim')
    print (df1)
        value1      value2     
    dim      A    B      A    B
    id                         
    1      NaN  1.2    1.0  2.0
    2      2.0  NaN    NaN  NaN
    3      3.0  NaN    NaN  NaN
    
    df2 = df1.xs('A', axis=1, level=1).combine_first(df1.xs('B', axis=1, level=1)).reset_index()
    print (df2)
       id  value1  value2
    0   1     1.2     1.0
    1   2     2.0     NaN
    2   3     3.0     NaN
    

    【讨论】:

    • 哇。非常感谢 - 它有效 :-) 对于有多个要组合的列的任何人,只需使用多个组合调用。
    猜你喜欢
    • 2021-08-24
    • 2019-01-08
    • 2019-08-10
    • 2020-02-27
    • 1970-01-01
    • 2018-09-29
    • 2017-09-16
    • 2019-10-22
    • 2021-11-15
    相关资源
    最近更新 更多