【问题标题】:Aggregate values pandas聚合值 pandas
【发布时间】:2021-12-05 18:37:58
【问题描述】:

我有一个这样的熊猫数据框:

Id A B C D

1 a b c d
2 a b   d 
2 a   c d
3 a     d
3 a b c

我想通过使用相同 ID 的信息,使用其他行中包含的值来聚合列 B-C 和 D 的空值。

生成的数据框应如下所示:

Id A B C D
1 a b c d
2 a b c d 
3 a b c d

对于相同的 ID,第一列 (A) 中可能有不同的值。在这种情况下,我宁愿放置另一个值来指示此事件,而不是放置第一个实例。

所以例如

Id A B C D   
1 a b c d
2 a b   d 
2 x   c d

变成:

Id A B C D   
1 a b c d
2 f b c d 

【问题讨论】:

  • 为什么x变成f
  • 看看pd.Groupby.first
  • 'f' 是随机值吗,因为 ID 2 的 a 和 x 不同?
  • 可能是ax 之间的平均值?
  • F 只是一个代表“这个 id 在 A 列中有 2 个不同的值”的值,只是一个标志。 F 当一个 id 在不同行的 A 列中具有不同的值时

标签: python pandas dataframe aggregate na


【解决方案1】:

IIUC,你可以使用groupby_agg

>>> df.groupby('Id')
      .agg({'A': lambda x: x.iloc[0] if len(x.unique()) == 1 else 'f',
            'B': 'first', 'C': 'first', 'D': 'first'})

    A  B  C  D
Id            
1   a  b  c  d
2   f  b  c  d

【讨论】:

  • 在第二种情况下,如何在 A 列中为具有不同值的 id 放置另一个字母?在这种情况下,Id 2 在 A 列中具有值 a 和 x。如何将字母 f 放在 A 列中的第二个数据框中,用于 id 2?
  • @Will。我更新了我的答案。请检查一下好吗?
【解决方案2】:

我能想到的最好方法是遍历每个唯一的Id,将其从原始数据帧中分割出来,并构建一个新行作为合并相关行的产物:

def aggregate(df):
    ids = df['Id'].unique()
    rows = []
    for id in ids:
        relevant = df[df['Id'] == id]
        newrow = {c: "" for c in df.columns}
        for _, row in relevant.iterrows():
            for col in newrow:
                if row[col]:
                    if len(newrow[col]):
                        if newrow[col][-1] == row[col]:
                            continue
                    newrow[col] += row[col]
        rows.append(newrow)
    return pd.DataFrame(rows)

【讨论】:

    猜你喜欢
    • 2018-03-03
    • 1970-01-01
    • 2017-06-20
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2019-05-15
    相关资源
    最近更新 更多