我有两个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']
答案 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' )
数据框: