我有一个.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
答案 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的数量,您可以更快或更慢几倍,但它肯定不会花费数小时。可能你使用线性搜索来获得会员资格。