我有一张桌子,看起来像这样-
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,但是我不知道应该如何进行连接,然后将结果上移到名称旁边。
发布于 2019-04-23 17:08:21
对第一列使用GroupBy.agg,使用ffill向前填充缺少的值和字典,字典是动态创建的-对于没有date和items的每一列,应用聚合函数GroupBy.first,对于最后一列,使用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如果可能只有几列,则使用ffill将2列传递给groupby,并将create dictionary传递给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发布于 2019-04-23 17:17:46
我们可以在forwardfill (ffill)中使用fillna。然后使用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, flosshttps://stackoverflow.com/questions/55807752
复制相似问题