Python 循环浏览多个CSV文件并与特定列合并[Pandas]
我有一个csv文件列表。每个文件有5列,其中“id”是唯一的公共列(主键)。其余4列都不同 我感兴趣的是第五列(最后一列),每一个文件都不同。我想在“id”上合并它们 我尝试了以下代码,但它按行连接,给了我太多重复的“id”和“NaN”值:Python 循环浏览多个CSV文件并与特定列合并[Pandas],python,pandas,dataframe,csv,merge,Python,Pandas,Dataframe,Csv,Merge,我有一个csv文件列表。每个文件有5列,其中“id”是唯一的公共列(主键)。其余4列都不同 我感兴趣的是第五列(最后一列),每一个文件都不同。我想在“id”上合并它们 我尝试了以下代码,但它按行连接,给了我太多重复的“id”和“NaN”值: filelist = glob.glob(path + "/*.csv") li = [] for filename in filelist: df = pd.read_csv(filename, index_col=Non
filelist = glob.glob(path + "/*.csv")
li = []
for filename in filelist:
df = pd.read_csv(filename, index_col=None, header=0, usecols=[0,5])
li.append(df)
frame = pd.concat(li, axis=0, ignore_index=True)
我想将它们按列连接到我的兴趣点列(第5列)
例如:
我的文件列表:['df1.csv','df2.csv','df3.csv','df4.csv']
df1.csv
具有以下结构:
ID No1 AA
0 1 0 4
1 2 1 5
2 3 0 6
ID No2 BB
0 2 0 5
1 3 1 6
2 4 0 7
df2.csv
具有以下结构:
ID No1 AA
0 1 0 4
1 2 1 5
2 3 0 6
ID No2 BB
0 2 0 5
1 3 1 6
2 4 0 7
这个名单还有很多。我期望的结果是:
ID AA BB CC DD
0 1 4.0 NaN 0 1
1 2 5.0 5.0 1 0
2 3 6.0 6.0 1 0
3 4 NaN 7.0 1 1
如有任何建议,将不胜感激。谢谢。仅使用第一列和最后一列在ID上合并:
df = df1.iloc[:,[0,-1]].merge(df2.iloc[:,[0,-1]],on="ID",how="outer")
第一次合并后,您只需要:
df = df.merge(df3.iloc[:,[0,-1]],on="ID",how="outer")
使用中:
import pandas as pd
data1 = {"ID":[1,2,3], "No1":[0,1,0], "AA":[4,5,6]}
data2 = {"ID":[2,3,4], "No2":[0,1,0], "BB":[5,6,7]}
data3 = {"ID":[1,3,4], "No2":[0,1,0], "CC":[2,3,4]}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
df3 = pd.DataFrame(data3)
df = df1.iloc[:,[0,-1]].merge(df2.iloc[:,[0,-1]],on="ID",how="outer")
print(df.merge(df3.iloc[:,[0,-1]],on="ID",how="outer"))
输出:
ID AA BB CC
0 1 4.0 NaN 2.0
1 2 5.0 5.0 NaN
2 3 6.0 6.0 3.0
3 4 NaN 7.0 4.0
从您的示例开始,将“ID”设置为索引并在其上隐式连接似乎是最简单的(使用
-1
数字索引按位置检索最后一列):
将熊猫作为pd导入
文件列表=[
“/tmp/csvs/df1.csv”,
“/tmp/csvs/df2.csv”,
]
结果=pd.DataFrame()
对于文件列表中的f:
df=pd.read_csv(f,sep='\s+')。set_index('ID'))
最后一列=df.列[-1]
result=result.join(df[last\u col],how='outer')
结果.重置索引(就地=真)
结果
出[1]:
身份证AA-BB
0114.0NaN
1 2 5.0 5.0
2 3 6.0 6.0
3.4.7.0
读取数据时,可以将id
设置为索引列。然后在所有数据帧上运行pd.join
。或者使用第一个数据帧作为左数据帧,其他数据帧作为右数据帧,并在id
索引上合并