如何根据条件连接同一列的值?

时间:2019-04-23 09:04:56

标签: python pandas data-cleaning

我有一个看起来像这样的表-

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,但是我不知道如何进行串联,然后将结果与名称一起向上移动。

2 个答案:

答案 0 :(得分:2)

GroupBy.agg与第一列和ffill一起使用,以向前填充缺失值和字典,动态创建-为没有dateitems的每一列应用聚合函数GroupBy.first,最后一列itemsjoin一起使用,缺失值已删除:

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)

我们可以将fillnaforwardfill (ffill)一起使用。然后,dropnagroupby同时与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