如何通过另一个文件中的值更改csv列中的值

时间:2019-05-08 06:11:10

标签: python csv dataframe

我有一个后处理CSV文件。我的文件示例:

serial_number1, name_number_ID1, price1, state1
serial_number2, name_number_ID1, price2, state2
serial_number3, name_number_ID2, price1, state3
serial_number4, name_number_ID3, price1, state4
...

所以我在列中有一个重复的名字。在另一个文件中,我有一个样品名称的别名,文件看起来是:

NAME_NUMBER_ID; Alias; Data; NrOfOfert
name_number_ID1; Name1; XX; YY
name_number_ID2; Name2; XX; YY
name_number_ID3; Name3; XX; YY

现在,我需要从第二个文件更改Alias上第一个文件中的NameID。

结果文件为:

    serial_number1, Name1, price1, state1
    serial_number2, Name1, price2, state2
    serial_number3, Name2, price1, state3
    serial_number4, Name3, price1, state4
    ...

读取第一个文件(数百个记录)并将nameID替换为适当的Alias的最佳方法是什么?我应该创建字典吗?有时我有太多的别名无法手动完成。

有人可以引导我找到最佳解决方案吗?

编辑:我刚刚从第二个文件创建了一个字典,并使用它:

def.replace({def.iloc[:,1]:dictionary})

感谢答案,我学到了很多东西。

2 个答案:

答案 0 :(得分:1)

我建议使用熊猫并导入read_csv。仅导入所需的列,然后合并数据框。

import pandas as pd
# For selecting cols you can use keys or col names
df1 = pd.read_csv(infile1, usecols=[0,3])
df2 = pd.read_csv(infile2, usecols=[1,2])

# Merge data set 1 and 2
new_df = pd.concat([df1, df2], axis=1, sort=False)

答案 1 :(得分:1)

如果您不准备为此使用熊猫,则可能需要逐行替换python。熊猫确实是为此而建造的,因此它是更好的选择。

此示例应开始进行更改,但实际上需要进行一些更改。

#open all necessary files
with open('infile.csv', 'r') as infile, open('namefile.csv', 'r') as namefile,
    open('outfile.csv', 'w') as outfile:

    #iterate over both input files
    for in_line, name_line in zip(infile, namefile):
        #collect the row's information
        out_ls = in_line.split(', ')
        #collect the name
        name = name_line.split('; ')[1]
        #replace the id with the name
        out_ls[1] = name
        #print out the line
        outfile.write(', '.join(out_ls))           

如果使用此代码,请注意行号匹配(这样就不会干扰标题,并且一个文件中的行数不会比另一个文件中的行多,这迫使程序提前结束)。此实现确实避免了通过逐行写入校正后的部分来由程序存储整个列或文件。祝你好运!