Python 2.7 - объединить два файла CSV без заголовков и с двумя разделителями в первом файле - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть один csv test1.csv (в нем нет заголовков !!!).У меня также есть, как вы можете видеть разделитель с конвейером, но также с ровно одной вкладкой после восьми столбца.

ug|s|b|city|bg|1|94|ON-05-0216  9.72|28|288
ug|s|b|city|bg|1|94|ON-05-0217  9.72|28|288

У меня есть второй файл test2.csv только с разделителем трубы

ON-05-0216|100|50
ON-05-0180|244|152
ON-05-0219|269|146

Так как из восьми столбцов из первого файла и из первого столбца из второго файла сопоставляется только одно значение (ON-05-0216), это означает, что в выходном файле должно быть только одно значение, но с добавлениемстолбца SUM из второго и третьего столбца из второго файла (100 + 50).

Таким образом, конечный результат будет следующим:

ug|s|b|city|bg|1|94|ON-05-0216  Total=150|9.72|28|288

или

ug|s|b|city|bg|1|94|ON-05-0216|Total=150    9.72|28|288

что бы ни было проще.

Я думаю, что лучший способ использовать это с пандами.Но я застрял с получением нескольких разделителей из первого файла и с тем, как сопоставлять столбцы без имен столбцов, поэтому не уверен, как продолжить дальше.

import pandas as pd

a = pd.read_csv("test1.csv", header=None)
b = pd.read_csv("test2.csv", header=None)
merged = a.merge(b,)
merged.to_csv("output.csv", index=False)

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Использование:

# Reading files
df1 = pd.read_csv('file1.csv', header=None, sep='|')
df2 = pd.read_csv('file2.csv', header=None, sep='|')

# splitting file on tab and concatenating with rest 
ndf = pd.concat([df1.iloc[:,:7], df1[7].str.split('\t', expand=True), df1.iloc[:,8:]], axis=1)
ndf.columns = np.arange(11)

# adding values from df2 and bringing in format Total=sum
df2.columns = ['c1', 'c2', 'c3']
tot = df2.eval('c2+c3').apply(lambda x: 'Total='+str(x))

# Finding which rows needs to be retained
idx_1 = ndf.iloc[:,7].str.split('-',expand=True).iloc[:,2]
idx_2 = df2.c1.str.split('-',expand=True).iloc[:,2]
idx = idx_1.isin(idx_2)      # Updated
ndf = ndf[idx].reset_index(drop=True)
tot = tot[idx].reset_index(drop=True)

# concatenating both CSV together and writing output csv
ndf.iloc[:,7] = ndf.iloc[:,7].map(str) + chr(9) + tot
pd.concat([ndf.iloc[:,:8],ndf.iloc[:,8:]], axis=1).to_csv('out.csv', sep='|', header=None, index=None)

# OUTPUT
# ug|s|b|city|bg|1|94|ON-05-0216    Total=150|9.72|28|288
0 голосов
/ 21 декабря 2018

Вы можете использовать конвейер в качестве разделителя при чтении csv pd.read_csv(... sep='|'), и только позже разделите столбцы, разделенные табуляцией, используя этот пример здесь.

При объединении двух фреймов данных выдолжен иметь общий столбец, с которым вы будете сливаться.Вы можете использовать их в качестве индекса для облегчения добавления после выполнения необходимой математики на отдельных фреймах данных.

...