Как объединить два файла CSV, которые не имеют одинаковое количество строк? - PullRequest
0 голосов
/ 17 июня 2019

Ниже приведены мои два 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 ]

1 голос
/ 17 июня 2019

Вам необходимо использовать некоторые параметры команды merge .

В этом случае ...

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

how='left' означает, что сохраняются только ключи, присутствующие в «левом» фрейме данных.

Строки, отличные оту тех, которые совпадают, будут отсутствующие значения, поэтому вам нужно будет использовать fillna (), чтобы заменить их на ноль

merged = merged.fillna(0)

... перед записью в CSV.

0 голосов
/ 17 июня 2019

Первая проблема, которую я вижу, это то, что вы пытаетесь прочитать CSV без указания разделителя. По умолчанию это ',', но вы используете пробелы. Это решается с помощью опции sep='\s+' при чтении файла.

Другая проблема - это имя каждого столбца. У вас нет одинакового атрибута Class в обоих файлах. Мы можем исправить это с помощью left_on и right_on аргументов.

import pandas as pd
a = pd.read_csv("filea.csv", sep='\s+')
b = pd.read_csv("fileb.csv", sep='\s+')
b = b.dropna(axis=1)
merged = a.merge(b, how='outer', left_on='Class', right_on='Attribute.2')
merged.to_csv("output.csv", index=False)
...