如何使用python在另一个csv文件的列中搜索csv列中的元素?

时间:2014-08-22 07:55:19

标签: python csv

我有一个.csv文件,包含1000万行,有些列为AuthorId PaperId Name。 我想在另一个具有相似列的.csv文件中找到此文件中的每个AuthorId。我想将第二个csv中找到的那些标记为“1”,否则为“2”。 什么是最好的pythonic方式来实现这个目标?

我通过简单地使用for循环和使用pandas来加载数据,编写了50行代码来实现上述目的。我得到了我想要的东西,但整个代码运行所花费的时间大约是6个小时。我想知道的是,是否有任何小的预定义模块或pandas / numpy中的函数,我不知道?

编辑:帝斯曼已经发布了答案,但我想发布我试图做同样事情的代码。文件大小= 536mb(两者)

import pandas as pd

data1=pd.read_csv('sample8.csv')
data2=pd.read_csv('Merged_Data2.csv')
list1=[]
count1=0
for i in data1['Author id']:
    count2=0
    check=0
    for j in data2['Author id']:
        if i==j:                      #compare two elements
            check = 1
            list1.append('1')         #if found append '1' to list
            count2+=1
            break
    if check == 0:           #check if element was found in other file or not and append '2'
        list1.append('2')
    count1+=1 
    print count1
print list1

data1["Label"] = list1            #create new column
print data1

1 个答案:

答案 0 :(得分:1)

如果您已经在使用pandas,那么您应该可以在几秒钟内完成此操作,而不是几小时。您可以使用isin快速构建一个系列,告诉您AuthorId是否同时包含:

>>> in_both = df1["AuthorId"].isin(df2["AuthorId"])
>>> in_both.value_counts()
False    9900514
True       99486
dtype: int64
>>> in_both.head(5)
0     True
1    False
2    False
3    False
4    False
Name: AuthorId, dtype: bool

然后你可以用这个来创建一个新专栏:

>>> df1["new_column"] = in_both.astype(int).replace({True: 1, False: 2})
>>> df1.head(5)
    AuthorId Name    PaperId  new_column
0  617812672    B  424981777           1
1  757076542    B  998817530           2
2  625856763    B  350728063           2
3  124624974    B  734725334           2
4    2719471    B  400606485           2

我在两个10M行帧上经过的时间约为5秒。根据处理器速度和不同AuthorIds的数量,您可以更快或更慢几倍,但它肯定不会花费数小时。可能你使用线性搜索来获得会员资格。