来自 2 个文件的 CSV 值映射,例如 pandas 中的地图
Posted
技术标签:
【中文标题】来自 2 个文件的 CSV 值映射,例如 pandas 中的地图【英文标题】:CSV value mapping from 2 files like map in pandas 【发布时间】:2018-11-10 03:09:35 【问题描述】:我有两个 csv 文件,它们是我用 python 从非结构化数据创建的,但我不希望我的脚本在 json 上运行脚本后输出两个文件。因此,假设我有一个文件 A,其列如下:
文件 1:
feats ID A B C E
AA 123 3343 234 2342 112
BB 121 3342 237 2642 213``
CC 122 3341 232 2352 912
DD 123 3343 233 5342 12
EE 121 3345 235 2442 2112
...等等,假设有 10000 行不同的值和 6 列。现在我想对照文件 2 检查“ID”列的这些值并合并 ID 的值。
文件 2:
Char_Name ID Cosmic Awareness
Uatu 123 3.4
Galan 121 4.5 ``
Norrin Radd 122 1.6
Shalla-bal 124 0.3
Nova 125 1.2
这个文件 2 只有 5 行,b 有 5 个不同的值,比如说 23 列值。我可以用地图轻松做到这一点或在熊猫中应用,但我是 处理 1000 个文件,不想那样做。他们有什么办法吗 就像通过将值与文件 1 和文件 2 上的相应 ID 值匹配来添加标题为“名称”和“宇宙”的新列(来自文件 2)将文件 2 值(名称和宇宙意识列)映射到文件 1。预期输出应该有点像这样。
最终文件:
feats ID A B C E Char_Name Cosmic Awareness
AA 123 3343 234 2342 112 Uatu 3.4
BB 121 3342 237 2642 213`` Galan 4.5
CC 122 3341 232 2352 912 Norrin Radd 1.6
DD 123 3343 233 5342 12 Uatu 3.4
EE 121 3345 235 2442 2112 Galan 4.5
提前致谢,如果他们有任何改进这个问题的方法,欢迎提出建议。我会将它们合并到这里。我在上面添加了预期的结果。
【问题讨论】:
你能添加 2,3 个文件的样本,比如 1000s 和预期的输出吗? Jezrael 我已经添加了我正在寻找的预期输出。 你觉得this 吗? 它可能会起作用,但问题再次出现在熊猫的方式上......我不想这样做并在初始阶段本身格式化 csv。因此,我们可以读取 2 个文件的任何方式,根据 id 执行类似于 map/merge 的操作都会有帮助。 【参考方案1】:我认为所有文件名都需要glob
,然后在列表理解中创建DataFrame
:
from functools import reduce
import glob
files = glob.glob('files/*.csv')
dfs = [pd.read_csv(fp) for fp in files]
最后merge
在一起:
df = reduce(lambda left,right: pd.merge(left,right,on='ID'), dfs)
对于outer
,可以使用concat
:
import glob
files = glob.glob('files/*.csv')
dfs = [pd.read_csv(fp, index_col=['ID']) for fp in files]
df = pd.concat(dfs, axis=1)
【讨论】:
以上是关于来自 2 个文件的 CSV 值映射,例如 pandas 中的地图的主要内容,如果未能解决你的问题,请参考以下文章