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 

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)

最新更新