使用 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 中获取唯一行,但获取合并了哪些行(或行中的值)的记录?的主要内容,如果未能解决你的问题,请参考以下文章