使用 python,我如何从 csv 中获取唯一行,但获取合并了哪些行(或行中的值)的记录?

Posted

技术标签:

【中文标题】使用 python,我如何从 csv 中获取唯一行,但获取合并了哪些行(或行中的值)的记录?【英文标题】:Using python, how do I get the unique rows from a csv, but get a record of which rows (or value from a row) were combined? 【发布时间】:2021-06-04 09:15:39 【问题描述】:

我有一个包含 11 列数据的 CSV 文件。前 10 个包含我希望从中保留唯一行的信息。最后一个包含此信息来源的文件名。

我只想获取前 10 行中的唯一行,并且有一个新的最后一列列出文件名,或者有其他列包含未堆叠的文件名。

例如:

Col1 Col2 Col3 Col4 Col10 Filname
a 1 NA NA NA File1
a 1 NA NA NA File2
NA NA b NA NA File1
NA NA b NA NA File3
NA NA b NA NA File4
NA NA NA d 1 File3

前往:

Col1 Col2 Col3 Col4 Col10 Filname1 Filname2 Filename3
a 1 NA NA NA File1 File2 NA
NA NA b NA NA File1 File3 File4
NA NA NA d 1 File3 NA NA

我整天都在与循环和/或熊猫战斗。

我尝试循环并添加唯一行,减去文件名作为字典键并将文件名附加到值,但这似乎需要很长时间。

我尝试使用 pandas 的 pivot 和 unstack,我什至尝试合并前 10 列并重新索引。但我还没有走多远。

我们将不胜感激。

哦,我得用python 2.7

【问题讨论】:

当我预览然后弄乱它们时,愚蠢的事情显示表格格式正确。任何有关解决此问题的建议也很好。干杯, 尝试在So for example:goes to: 之后添加一个额外的行,或者更好,将csv 编写为逗号分隔的代码,以便我们可以重现和测试 到目前为止你尝试了什么? 【参考方案1】:

您可以groupby 基于除文件名之外的所有列,然后将文件名与join 聚合以创建一个列,列出每个不同的其他列值集的所有文件名:

df.groupby(
    df.columns.drop('Filname').to_list(),
    dropna=False)['Filname'].apply(', '.join).reset_index()

输出:

  Col1  Col2 Col3 Col4  Col10              Filname
0    a   1.0  NaN  NaN    NaN         File1, File2
1  NaN   NaN    b  NaN    NaN  File1, File3, File4
2  NaN   NaN  NaN    d    1.0                File3

【讨论】:

太棒了!谢谢你。我想我使用的是旧版本的 pandas,但我不愿意更新,因为团队中的其他人可能正在使用旧版本。我不得不从 to_list 中删除“_”,我无法让“dropna”工作(这个版本的 pandas 中的错误),所以我用 0 替换了 NaN(值不在数据中)。感谢您的所有帮助,包括为我整理我的问题。一个非常优雅的解决方案。干杯,

以上是关于使用 python,我如何从 csv 中获取唯一行,但获取合并了哪些行(或行中的值)的记录?的主要内容,如果未能解决你的问题,请参考以下文章

PHP CSV,如何从当前行获取前三行和后三行

列中每行具有唯一值的 Python/CSV 唯一行

如何通过命令行从多个文件夹中获取完整文件名到 csv

如何将数据从 python 列表中的列和行写入 csv 文件?

如何从 VBA 中的表中获取唯一行?

如何从熊猫中获取整行数据