我将目录中的所有文件连接成一个,但是有些文件的条目数不同 - 当文件中没有该键的值时,如何放置NaN?
例如:
file1.cs
NUM, NAME, ORG, DATA
1,AAA,10,123.4
1,AAB,20,176.5
1,AAC,30,133.5
file2的。 CS
NUM, NAME, ORG, DATA
1,AAA,10,111.4
1,AAC,30,122.5
2,BBA,12,156.7
期望输出
NUM, NAME, ORG, File1, File2 ....
1, AAA, 10, 123.4, 111.4
1, AAB, 20, 176.5, NaN
1, AAC, 30, 133.5, 122.5
2, BBA, 12, NaN, 156.7
.....
这是我尝试过的:
import pandas as pd
import glob
writer = pd.ExcelWriter('analysis.xlsx', engine='xlsxwriter')
data = []
df1 = pd.read_csv("file1.cs", sep = ',', header = 'infer')
for infile in glob.glob("*.cs"):
df = pd.read_csv(infile, sep = ',', header = 'infer')
name = infile[13:-7]
df['filename'] = name
data.append(df)
result = pd.merge(df1, data.to_frame(), on= 'NAME')
result.to_excel(writer, sheet_name=sheetname)
writer.save()
我也试过了pd.concat(data, axis=1, ignore_index=False)
但是这并没有添加NaN,因为它只是根据列名连接文件。
答案 0 :(得分:3)
使用merge
,参数how
等于'外部':
df1.merge(df2, on=['NUM','NAME','ORG'], how='outer')
输出:
NUM NAME ORG DATA_x DATA_y
0 1 AAA 10 123.4 111.4
1 1 AAB 20 176.5 NaN
2 1 AAC 30 133.5 122.5
3 2 BBA 12 NaN 156.7
要准确使用输出:
df1.rename(columns={'DATA':'FILE'})\
.merge(df2.rename(columns={'DATA':'FILE'}),
on=['NUM','NAME','ORG'],
how='outer',
suffixes=('1','2'))
输出:
NUM NAME ORG FILE1 FILE2
0 1 AAA 10 123.4 111.4
1 1 AAB 20 176.5 NaN
2 1 AAC 30 133.5 122.5
3 2 BBA 12 NaN 156.7
答案 1 :(得分:1)
尝试一下这个:
df1 = pd.read_csv("file1.cs", sep = ',', header = 'infer')
df2 = pd.read_csv("file2.cs", sep = ',', header = 'infer')
merged_df = df1.merge(df2, on=['NUM','NAME','ORG'], how='outer')
你可以在你的循环中读取df2,但这是获得你想要的一般语法。
答案 2 :(得分:1)
这是一种方式。使用suffixes
参数命名列。
pd.merge(df1, df2, how='outer', on=['NUM', 'NAME', 'ORG'], suffixes=('_FILE1', '_FILE2'))
# NUM NAME ORG DATA_FILE1 DATA_FILE2
# 0 1 AAA 10 123.4 111.4
# 1 1 AAB 20 176.5 NaN
# 2 1 AAC 30 133.5 122.5
# 3 2 BBA 12 NaN 156.7