Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 循环浏览多个CSV文件并与特定列合并[Pandas]_Python_Pandas_Dataframe_Csv_Merge - Fatal编程技术网

Python 循环浏览多个CSV文件并与特定列合并[Pandas]

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

我有一个csv文件列表。每个文件有5列,其中“id”是唯一的公共列(主键)。其余4列都不同

我感兴趣的是第五列(最后一列),每一个文件都不同。我想在“id”上合并它们

我尝试了以下代码,但它按行连接,给了我太多重复的“id”和“NaN”值:

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
索引上合并