如何在使用pandas连接两个csv文件时删除分隔符?

时间:2015-07-14 05:31:31

标签: python python-2.7 parsing csv pandas

我有三个.csv这样的文件,它们都有相同的id和相同的tag,但不同的text

.csv文件一:

id,text
ID_one_111,some text_1
...
ID_n-th_n,some text_n

.csv文件二

id,text,tag
ID_one_111,some different text_1
...
ID_n-th_n,some different text_n

这样的tags文件

id,tag
ID_one_111,1
...
ID_n-th_n,5

但是,我想生成一个新的csv文件,其中包含text列和tags的串联,如下所示:

id,text,tag
ID_one_111,some text_1 some different text_1,3
...
ID_n-th_n,some text_n some different text_n,5

为此,我使用pandas如下,这是我实际尝试的内容:

# -- coding: utf-8 --
import pandas as pd
pd.set_option('display.max_rows', 3000)

df1=pd.read_csv('path/of/the/first/file.csv')

df2=pd.read_csv('path/of/the/second/file.csv').drop('id',1)

label = pd.read_csv('path/of/the/tag_file/tags.csv').drop('id',1)


new_df = pd.concat([df1,df2, label], axis=1)


new_df.reset_index(drop=True)

new_df.to_csv('path/of/the/new/file.csv',
              sep=',', encoding='utf-8', index=False)

这种方法的问题在于我得到的结论是:

id,text,text,tag
ID_one_111,some text_1, some different text_1,3
...
ID_n-th_n,some text_n, some different text_n,5

回想一下,我如何修复上述方法并合并text列和标记列以获得类似的内容:

id,text,tag
ID_one_111,some text_1 some different text_1,3
...
ID_n-th_n,some text_n some different text_n,5

如何,我阅读to_csv文档,但我没有找到任何" drop separator参数"。先谢谢你们。

更新

感谢@maxymoo回答我试过这个:

df_final = pd.DataFrame({'id':new_df.iloc[:,0],
                         'content':new_df.iloc[:,1] + ' ' + new_df.iloc[:,2],
                         'label':new_df.iloc[:,3]}).to_csv('new.csv',
              sep=',', encoding='utf-8', index=False)

但该文件只是与id,text和tag

混乱

3 个答案:

答案 0 :(得分:2)

这是一个解决方案,虽然没有使用熊猫:

import csv
from collections import defaultdict

rows = defaultdict(list)

for csv in ['csv_one.csv', 'csv_two.csv', 'csv_three.csv']:
    with open(csv) as f:
        next(f) # skips the header row
        reader = csv.reader(f, delimiter=',')
        for row in reader:
            rows[row[0]].append(row[1:])

with open('out.csv', 'w') as f:
    writer = csv.writer(f, delimiter=',')
    for k,v in rows.iteritems():
         writer.writerow([k]+v)

答案 1 :(得分:0)

我认为解决这个问题的最佳方法是在你拥有的两列上进行矢量化字符串操作。像这样:

df_final = pd.DataFrame({'ID':new_df.iloc[:,0], 
                         'text':new_df.iloc[:,1] + ' ' + new_df.iloc[:,2], 
                         'tag':new_df.iloc[:,3]})

此外,您最好确保所有ID在您的文件中排成一行,否则您可能需要考虑使用merge而不是concat

答案 2 :(得分:0)

有序词典可用于根据您的第一个文件保留行顺序,如果3个CSV输入文件不排列100%,它也可以使用。如上所述,熊猫对此行动可能过度。

3个源CSV文件中的每个文件的标题也会合并到输出CSV文件中。

import collections, csv

drows = collections.OrderedDict()
lheaders = []

for file in ["file_1.csv", "file_2.csv", "file_3.csv"]:
    with open(file, "r") as f_input:
        csv_input = csv.reader(f_input)
        headers = csv_input.next()
        lheaders.extend(headers[1:])

        for data_row in csv.reader(f_input):
            drows.setdefault(data_row[0], []).extend(data_row[1:])

with open("output.csv", "wb") as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerow([headers[0]] + lheaders)

    for id, row in drows.items():
        csv_output.writerow([id] + row)