基于密钥的CSV加入

时间:2016-09-16 16:29:09

标签: python csv inner-join csvkit

这可能是一个简单/重复的问题,但我可以找到/弄清楚如何做到这一点。

我有两个csv文件:

info.csv:

"Last Name", First Name, ID, phone, adress, age X [Total age: 100] |009076

abc, xyz, 1234, 982-128-0000, pqt,

bcd, uvw, 3124, 813-222-1111, tre, 

poi, ccc, 9087, 123-45607890, weq,

然后

age.csv:

student_id,age_1

3124,20

9087,21

1234,45

我想根据 info.csv 中的“id”和 age.csv <中的“student_id”比较两个csv文件/ strong>并获取相应的“age_1”数据并将其放入 info.csv 中的“age”列。

所以最终的输出应该是:

info.csv:

"Last Name", First Name, ID, phone, adress, age X [Total age: 100] |009076
 abc, xyz, 1234, 982-128-0000, pqt,45
 bcd, uvw, 3124, 813-222-1111, tre,20
 poi, ccc, 9087, 123-45607890, weq,21

我可以简单地将基于密钥的表格加入 new.csv ,但不能将数据放在列标题“age”中。我使用“csvkit”来做到这一点。

以下是我使用的内容:

csvjoin -c 3,1 info.csv age.csv > new.csv

2 个答案:

答案 0 :(得分:3)

您可以使用Pandas并使用info dataframe数据更新age。您可以将两个数据框的索引分别设置为IDstudent_id,然后更新info dataframe中的年龄列。之后,您重置索引,以便ID再次成为一列。

from StringIO import StringIO
import pandas as pd

info = StringIO("""Last Name,First Name,ID,phone,adress,age X [Total age: 100] |009076
abc, xyz, 1234, 982-128-0000, pqt,
bcd, uvw, 3124, 813-222-1111, tre, 
poi, ccc, 9087, 123-45607890, weq,""")


age = StringIO("""student_id,age_1
3124,20
9087,21
1234,45""")

info_df = pd.read_csv(info, sep=",", engine='python')
age_df = pd.read_csv(age, sep=",", engine='python')

info_df = info_df.set_index('ID')
age_df = age_df.set_index('student_id')
info_df['age X [Total age: 100] |009076'].update(age_df.age_1)
info_df.reset_index(level=0, inplace=True)
info_df

输出:

    ID      Last Name   First Name      phone           adress  age X [Total age: 100] |009076
0   1234    abc         xyz              982-128-0000   pqt     45
1   3124    bcd         uvw              813-222-1111   tre     20
2   9087    poi         ccc              123-45607890   weq     21

答案 1 :(得分:1)

试试这个......

iframe.style.height="";

让我知道它是否有效或有什么不清楚。我使用了一个字典,因为如果你的文件很大,它应该更快,因为你只需要遍历age.csv中的数据一次。

可能有一种更简单的方法/已经实施的东西......但这应该可以解决问题。