【问题标题】:Creating lists out of multiple duplicate strings in pandas dataframe使用 pandas 数据框中的多个重复字符串创建列表
【发布时间】:2021-11-10 06:16:49
【问题描述】:

我正在尝试对 pandas 中的行进行重复数据删除。我有数百万行重复,它不适合我正在尝试做的事情。

从这里:

   col1  col2
0     1     23
1     1     47
2     1     58
3     1     9
4     1     4

我想得到这个:

   col1  col2
0     1     [23, 47, 58, 9, 4]

我已经设法通过为每个电子表格编写单独的脚本来手动完成此操作,但如果有一种更通用的方式来做这件事,那就太好了。

到目前为止我已经尝试过:

 def remove_duplicates(self, df):
        ids = df[self.key_field].unique()        
        numdicts = []
        for i in ids:
            instdict = {self.key_field: i}            
            for col in self.deduplicate_fields:
                xf = df.loc[df[self.key_field] == i]                    
                instdict[col] = str(list(xf[col]))
            numdicts.append(instdict)

        for n in numdicts:
            print(pd.DataFrame(data=n, index=self.key_field))
        return df

但令人难以置信的是,这会返回与我开始时相同的内容。

到目前为止,我管理它的唯一方法是手动为每一列创建列表并循环遍历数据框中的唯一索引键,并将所有重复项添加到列表中,然后压缩所有列表并创建来自他们的数据框。

但是,当需要去重的列数未知时,这似乎不起作用。

如果有更好的方法,我们将不胜感激!

提前致谢!

【问题讨论】:

  • 对于数百万行,您真的要将列表放入数据框中吗?列表中的所有这些指针很容易失去减少行的效率增益。此外,您将失去进行矢量化计算的能力。
  • 有趣,谢谢!不幸的是,由于我们对正在使用的开发提供商的限制,我一直坚持这种方式。

标签: python python-3.x pandas


【解决方案1】:

当您只需要一列时,这就是您要寻找的吗:

df.groupby('col1')['col2'].apply(lambda x: list(x)).reset_index()

对于所有其他列,请使用 agg:

df.groupby('col1').apply(lambda x: list(x)).reset_index()

使用agg,您还可以指定要使用的列:

df.groupby('col1')['col2', 'col3'].apply(lambda x: list(x)).reset_index()

【讨论】:

  • 哇,这太奇怪了。由此(当我将一个列表放在“col2”的位置时,我得到了实际的列名作为“col1”字段之后的值......所以当我使用它时,它非常适用于 ONE 列。我是在对任意数量的列执行相同操作之后。
  • 是的,apply 适用于您的示例,对于多个列,请使用 agg
  • 谢谢 - 这太棒了。
  • 使用apply 你可以只使用list... df.groupby('col1').col2.apply(list)
【解决方案2】:

您可以尝试以下方法:

df.groupby('col1').agg(lambda x: list(x))

【讨论】:

  • 谢谢,但我得到一个错误:数据必须是一维的
  • 可能是因为您已经在 col2 中有列表,您应该使用 list 代替。我会更新我的答案。
【解决方案3】:

对于多个列,它应该如下所示以避免错误:

df.groupby('col1')[['col2','col3']].agg(lambda x: list(x)).reset_index()

【讨论】:

    猜你喜欢
    • 2019-07-10
    • 2019-01-03
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多