【问题标题】:How to concatenate values of the same column based on a condition?如何根据条件连接同一列的值?
【发布时间】:2019-04-23 17:17:45
【问题描述】:

我有一张像这样的桌子 -

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

【问题讨论】:

标签: python pandas data-cleaning


【解决方案1】:

使用GroupBy.agg 与第一列和ffill 用于前向填充缺失值和字典,这是动态创建的 - 对于没有dateitems 的每一列应用聚合函数GroupBy.first 和最后一列@ 987654328@ 使用 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

如果只有几列是可能的,则将 2 列传递给 groupbyffill,并创建传递给 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

【讨论】:

  • 感谢您的解决方案。你能解释一下第一行吗?它到底在做什么?
  • @rik_maz - 添加了解释。
【解决方案2】:

我们可以使用fillnaforwardfill (ffill)。然后dropna 和同时groupbyagg 得到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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多