我有一个看起来像这样的表-
date name values items
01-03-2019 xyz 900 NaN
NaN NaN 900 brush
02-03-2019 abc 1200 NaN
NaN NaN 900 paste
NaN NaN 300 floss
,期望的输出是-
date name values items
01-03-2019 xyz 900 brush
02-03-2019 abc 1200 paste, floss
我知道我可以使用np.where()将每个项目的值设为NaN,但是我不知道如何进行串联,然后将结果与名称一起向上移动。
答案 0 :(得分:2)
将GroupBy.agg
与第一列和ffill
一起使用,以向前填充缺失值和字典,动态创建-为没有date
和items
的每一列应用聚合函数GroupBy.first
,最后一列items
与join
一起使用,缺失值已删除:
d = dict.fromkeys(df.columns.difference(['date','items']), 'first')
d['items'] = lambda x: ', '.join(x.dropna())
df = df.groupby(df['date'].ffill()).agg(d).reset_index()
print (df)
date name values items
0 01-03-2019 xyz 900 brush
1 02-03-2019 abc 1200 paste, floss
如果只有少数几列,则用groupby
将2列传递到ffill
并创建传递给agg
的字典:
df = (df.groupby([df['date'].ffill(), df['name'].ffill()])
.agg({'values':'first', 'items':lambda x: ', '.join(x.dropna())})
.reset_index())
print (df)
date name values items
0 01-03-2019 xyz 900 brush
1 02-03-2019 abc 1200 paste, floss
答案 1 :(得分:0)
我们可以将fillna
与forwardfill (ffill)
一起使用。然后,dropna
和groupby
同时与agg
一起获得值sum
并合并项目中的字符串:
df[['date', 'name']] = df[['date', 'name']].fillna(method='ffill')
df = df.dropna().groupby('date').agg({'name':'first',
'values':'sum',
'items':', '.join}).reset_index()
print(df)
date name values items
0 01-03-2019 xyz 900 brush
1 02-03-2019 abc 1200 paste, floss