我有一个像这样的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
iuc,可以使用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)