从csv文件中读取字符串并在Pandas中的另一个csv中查找相应字符串的标签

时间:2017-02-09 04:09:50

标签: python csv pandas

我有两个csv文件,一个非常大,有几千行,另一个有正常大小。我在每个csv文件中都有一个列,其中包含某个产品的名称,我称之为ProductName。大csv包含一列中所有产品的名称以及另一列中这些产品的标签。较小的csv文件包含较大csv的一些产品名称以及那里不存在的一些名称。我想要做的是读取较小的csv文件中的ProductName列的每一行,并检查我是否可以在大型csv的ProductName列中找到相同的名称。如果在较大的csv中找到匹配项,我需要在大型csv文件中复制相应产品的标签列的内容,并将其保存在较小的csv中的新列中。我正在使用熊猫,我可以得到我想要的东西。这是我的代码:

import pandas as pd

df=pd.read_csv('Products.csv')         #small csv file
df2=pd.read_csv('ProductsMain.csv')    #large csv file
rowCounter=0
for name in (df['ProductName']):

    nameCounter=df2.ProductName.str.contains(name).sum()
    if nameCounter>0:  # only checking for the product label if it exists in the larger csv
       rowNum=df2[df2['ProductName']==name].index[0]
       label=df2.iloc[rowNum,-1]  #Label column is the last column in df2
       df.set_value(rowCounter,'Label',label)
       df.to_csv('Products.csv',index=False)
    rowCounter +=1

我在这里有两个问题:首先,有没有更好的方法来做到这一点。特别是,当csv文件的大小非常大时,我不确定这是否是在较大的csv文件中找到匹配名称的最佳方式(就速度而言)。第二,如果我不知道标签列的位置,我想通过名称和行索引来调用它,因为iloc不能同时使用名称和数字。我的意思是,我不能使用df2.iloc[rowNum,'label'],但我想知道一些方法来做到这一点。

修改:如果上述说明不够清晰,请查看此示例。假设我有两个csv文件如下:

ProductsMain.csv:                         

ProductName   0  1  2  3  Label
X1            29 74 30 60   0
X2            18 25 84 70   0
X3            10 45 72 43   1
X4            35 70 65 39   0
Y1            14 35 80 58   2
Y2            25 65 40 30   2
Y3            40 60 18 90   2
Y4            10 20 35 70   1


Products.csv:

ProductName   0  1  2  3  
X2            18 25 84 70
Y1            14 35 80 58
Y5            19 37 49 75
X1            29 74 30 60

运行代码后:

Products.csv:

ProductName   0  1  2  3  Label
X2            18 25 84 70   0
Y1            14 35 80 58   2
Y5            19 37 49 75   
X1            29 74 30 60   0

换句话说,首先我检查Products.csv中的产品名称,如果我能在ProductsMain.csv中找到匹配的名称,我会找到该产品的相应标签并将其保存在新列中(这是在Products.csv中调用Label),如果ProductsMain.csv中不存在该名称,我什么都不做,继续到Products.csv中的下一个productName,直到我到达产品的末尾.csv格式。

编辑2:我还发现我可以使用ix而不是iloc来按名称和索引到达单元格:label=df2.ix[rowNum,'label']

1 个答案:

答案 0 :(得分:2)

您可以在pandas中使用Merge函数来合并两个数据帧,如下所示 -

import pandas as pd
df_productsMain = pd.DataFrame({'ProductName': ['P0', 'P1', 'P3'],
                    'X1': ['X10', 'X11', 'X13'],
                    'X2': ['X20', 'X21', 'X23'],
                    'Label': ['L0', 'L1', 'L3']},
                   index=[0, 1, 2])


df_products= pd.DataFrame({'ProductName': ['P0', 'P1', 'P2', 'P3', 'P4'],
                            'Y1': ['Y0', 'Y1', 'Y2', 'Y3', 'Y4'],
                            'Y2': ['Y0', 'Y1', 'Y2', 'Y3', 'Y4'],
                            'Y3': ['Y0', 'Y1', 'Y2', 'Y3', 'Y4']},
                           index=[0, 1, 2, 3, 4])

df_mergedResult = pd.merge(df_products, df_productsMain[['ProductName', 'Label']], on='ProductName', how='left' )

数据框:

enter image description here enter image description here enter image description here