Pandas - 在pd.merge时为缺失值添加NaN

时间:2018-02-22 17:33:57

标签: python pandas merge

我将目录中的所有文件连接成一个,但是有些文件的条目数不同 - 当文件中没有该键的值时,如何放置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,因为它只是根据列名连接文件。

3 个答案:

答案 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