如何合并行数不相同的两个csv文件?

时间:2019-06-17 16:31:08

标签: python csv merge

下面是我的两个csv文件:

CSV1:


Class   DTWC    DR  DW  IDFP    IDS ISQLQ   IGS LIC LT  MIM NLMR    PD  RAM SL  UC  LazyClass
com.onegravity.colorpicker.demo.MainActivity    0   0   0    0  0   0   0   0   0   1   1   0   0   0   0   0
com.onegravity.colorpicker.demo.SettingsActivity    0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0
com.onegravity.colorpicker.AlphaPatternDrawable 0   0   0   0   0   0   0   0   0   1   0   0   0   1   0   0
com.onegravity.colorpicker.ColorPickerDialog    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

CSV2:


Push Down Attribute Move Class  Rename Class    Move and Rename Class Extract and Move Method   Move Source Folder  Change Package  Extract Variable Rename Attribute   Move and Rename Attribute    Replace Variable with Attribute Replace Attribute  Merge Variable  Merge  Parameter    Merge Attribute split Variable  split Parameter Split  Attribute    Class
0   1   0   0   0   0   0   0   0   0    0  0   0   0   0   0   0   0   0   0 0 0   0   0   0   0   0         com.onegravity.colorpicker.AlphaPatternDrawable

我需要合并它们,所以我使用了以下代码:

import pandas as pd
a = pd.read_csv("filea.csv")
b = pd.read_csv("fileb.csv")
b = b.dropna(axis=1)
merged = a.merge(b, on='Class')
merged.to_csv("output.csv", index=False)

第二个csv文件不包含所有类的问题,它仅包含一个类,因此我需要将第二个csv合并到第三行中,并在其余行中放入0。

感谢帮助!

2 个答案:

答案 0 :(得分:1)

您需要对merge命令使用某些选项。

在这种情况下...

merged = a.merge(b, on='Class', how='left')

how='left'意味着只保留“左侧”数据框中存在的键。

匹配的行以外的行将缺少值,因此您将需要使用fillna()将其替换为零

merged = merged.fillna(0)

...在写入CSV之前。

答案 1 :(得分:0)

我看到的第一个问题是您试图读取CSV而不显示分隔符。默认情况下为',',但您使用空格。读取文件时使用n = int(input()) s = str(input()) j, i = n // 2, n // 2 + 1 # debug # print(f'initial \n x = {j}, y = {i}') while (j > 0 and s[j] == '0'): j-=1 while (i < n and s[i] == '0'): i+=1 # debug # print(f'final\n x = {j}, y = {i}') if j==0: print(int(s[0:i]) + int(s[i:n])) print('statement1') elif i==n: print( int(s[0:j]) + int(s[j:n])) print('statement2') else: print(min( int(s[:i])+ int(s[i:]), int(s[:j]) + int(s[j:]))) 选项可以解决此问题。

另一个问题是每列的名称。两个文件中的属性sep='\s+'不同。我们可以使用Classleft_on参数来解决此问题。

right_on