来自 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 中的地图的主要内容,如果未能解决你的问题,请参考以下文章

来自 csv 文件的 PostgreSQL 查询 [重复]

SSIS:来自 csv 文件的数据问题:

如何比较来自多个csv的数据

如何在 R 中加入来自 2 个不同 csv 文件的数据?

当隐含 ID 列时,合并来自 csv 文件的许多数据框?

将十进制值格式化为具有 2 个小数位的货币 [重复]