聚合值 pandas

Aggregate values pandas

我有一个这样的 pandas 数据框:

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 

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

我能想到的最好的方法是遍历每个唯一的 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)