总价值

2024-04-19 00:05:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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 

Tags: 数据实例信息id事件情况空值框应
2条回答

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)

相关问题 更多 >