【问题标题】:Merge column data from some rows with Pandas使用 Pandas 合并某些行的列数据
【发布时间】:2021-09-28 16:55:49
【问题描述】:

我有一个 CSV 文件,我想合并某些行中某些列的数据。

例如我有:

Name ID Data Parent
Name1 100 Blue 001
Name1 101 Grey 001
Name1 102 Grey 001
Name1 103 Black 001
Name2 200 Red 002
Name2 201 Green 002

我想拥有:

Name ID Data Parent
Name1 100 Blue 001
Name1 101 Grey 001
Name1 102 Grey 001
Name1 103 Black 001
Name2 200 Red 002
Name2 201 Green 002
Name1 001 Blue,Grey,Black
Name2 002 Red,Green

我的文件有 62,000 行。我可以在不到 5 秒的时间内更改一些标题、添加/删除/修改列等等。 但是在这部分我有点卡住了。你知道怎么做吗?

感谢您的帮助!

【问题讨论】:

  • 欢迎来到 SO @Simlock,请参阅 what to do when someone answers,如果您有时间尝试答案,您可以在其下方评论您的问题,支持或反对,并可能接受最适合您的答案.

标签: python pandas dataframe csv


【解决方案1】:

您可以使用groupby+agg 计算新行,然后使用pandas.concat 将其与原始数据框合并:

pd.concat([df,
           (df.groupby('Parent')
              .agg({'Name': 'first', 'Parent': 'first', 'Data': ','.join})
              .rename(columns={'Parent': 'ID'})
              .reset_index(drop=True)
           )
          ]).fillna('') # optional fillna to remove the NaNs
    Name   ID                  Data Parent
0  Name1  100                  Blue    001
1  Name1  101                  Grey    001
2  Name1  102                  Grey    001
3  Name1  103                 Black    001
4  Name2  200                   Red    002
5  Name2  201                 Green    002
0  Name1  001  Blue,Grey,Grey,Black       
1  Name2  002             Red,Green       

【讨论】:

  • 我在理解 agg 函数的工作原理时遇到了一些麻烦,但我正在尝试阅读文档。就我而言,我不想看到重复的值。我会试试你的解决方案
  • @Simlock 然后用','.join 代替lambda x: ','.join(set(x))
  • 非常感谢!您的解决方案帮助我实现了我的目标。我想弄清楚最后一个细节,你的函数把我的父母变成了一个浮点数。例如 001 变成 001.0
  • 好吧,你可以使用新的integer NA,除此之外,001在python中不是一个有效的整数,前导零是不允许的,所以要么使用字符串,要么接受@ 987654330@
  • 是的,这是真的,我在创建示例时没有想到这一点。事实上,我的 CSV 有像 75043610 这样的数字,它变成了 75043610.0 在我的例子中,1 变成了 1.0 我会看看你的函数
【解决方案2】:

您可以使用 groupby.unique 获取每个父级的唯一颜色列表,然后使用 .str.join 将它们设为单个值:

>>> parents = df.groupby(['Name', 'Parent'])['Data'].unique().str.join(',')
>>> parents
Name    Parent
Name1   001       Blue,Grey,Black
Name2   002             Red,Green
Name: Data, dtype: object

如果您的 pandas 选项太旧,您可以将 .unique() 替换为 .agg(set)

>>> parents = df.groupby(['Name', 'Parent'])['Data'].agg(set).str.join(',')

然后进行一些调整以使其适合初始数据帧的格式,然后我们可以简单地附加它:

>>> parents = parents.reset_index().rename(columns={'Parent': 'ID'}).assign(Parent='')
>>> parents
     Name   ID             Data Parent
0  Name1   001  Blue,Grey,Black       
1  Name2   002        Red,Green       
>>> df.append(parents)
     Name   ID             Data Parent
0  Name1   100             Blue    001
1  Name1   101             Grey    001
2  Name1   102             Grey    001
3  Name1   103            Black    001
4  Name2   200              Red    002
5  Name2   201            Green    002
0  Name1   001  Blue,Grey,Black       
1  Name2   002        Red,Green       

【讨论】:

  • 您好 Cimbali,我似乎无法使用“.unique”。它不存在,甚至在 Pandas 文档中我也看不到它。
  • GroupBy.unique 记录在这里 @Simlock: pandas.pydata.org/pandas-docs/version/1.2.0/reference/api/… 你使用的是什么熊猫版本?
  • @Simlock 我已经更新了一个替代品
  • 感谢辛巴利!我有版本 1.3.3。也许“独特”功能不起作用,因为我正在使用数据框而不是系列。无论如何,GroupBy 和 Agg 是我需要的功能,我不知道如何使用它们。非常感谢!
  • 不客气@Simlock。见what to do when someone answers
猜你喜欢
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 2021-05-07
  • 2019-01-13
  • 1970-01-01
相关资源
最近更新 更多