比较 DataFrame 的所有行的最快方法
Fastest way to compare all rows of a DataFrame
我编写了一个程序(在 Python 3.6 中)试图将用户 csv/excel 的列映射到我拥有的模板 xls。到目前为止一切顺利,但此过程的一部分必须是用户的数据处理,即联系人。例如,我想删除重复项、合并数据等。为此,我需要将每一行与所有其他行进行比较,这很昂贵。我阅读的每个用户的 csv 都有 ~ 2000-4000 行,但我希望它对更多行有效。我已将数据存储在 pd.DataFrame.
中
有没有比蛮力更有效的比较方法?
谢谢
首先,你试过什么代码?
但是要删除重复项,这在 pandas 中非常容易。示例如下:
import pandas as pd
import numpy as np
# Creating the Test DataFrame below -------------------------------
dfp = pd.DataFrame({'A' : [np.NaN,np.NaN,3,4,5,5,3,1,5,np.NaN],
'B' : [1,0,3,5,0,0,np.NaN,9,0,0],
'C' : ['AA1233445','A9875', 'rmacy','Idaho Rx','Ab123455','TV192837','RX','Ohio Drugs','RX12345','USA Pharma'],
'D' : [123456,123456,1234567,12345678,12345,12345,12345678,123456789,1234567,np.NaN],
'E' : ['Assign','Unassign','Assign','Ugly','Appreciate','Undo','Assign','Unicycle','Assign','Unicorn',]})
print(dfp)
#Output Below----------------
A B C D E
0 NaN 1.0 AA1233445 123456.0 Assign
1 NaN 0.0 A9875 123456.0 Unassign
2 3.0 3.0 rmacy 1234567.0 Assign
3 4.0 5.0 Idaho Rx 12345678.0 Ugly
4 5.0 0.0 Ab123455 12345.0 Appreciate
5 5.0 0.0 TV192837 12345.0 Undo
6 3.0 NaN RX 12345678.0 Assign
7 1.0 9.0 Ohio Drugs 123456789.0 Unicycle
8 5.0 0.0 RX12345 1234567.0 Assign
9 NaN 0.0 USA Pharma NaN Unicorn
# Remove all records with duplicated values in column a:
# keep='first' keeps the first occurences.
df2 = dfp[dfp.duplicated(['A'], keep='first')]
#output
A B C D E
1 NaN 0.0 A9875 123456.0 Unassign
5 5.0 0.0 TV192837 12345.0 Undo
6 3.0 NaN RX 12345678.0 Assign
8 5.0 0.0 RX12345 1234567.0 Assign
9 NaN 0.0 USA Pharma NaN Unicorn
如果你想要一个没有重复检查所有列的新数据框,请使用波浪号。 ~
运算符本质上是 not equal to
或 !=
运算符。官方文档 here
df2 = dfp[~dfp.duplicated(keep='first')]
我编写了一个程序(在 Python 3.6 中)试图将用户 csv/excel 的列映射到我拥有的模板 xls。到目前为止一切顺利,但此过程的一部分必须是用户的数据处理,即联系人。例如,我想删除重复项、合并数据等。为此,我需要将每一行与所有其他行进行比较,这很昂贵。我阅读的每个用户的 csv 都有 ~ 2000-4000 行,但我希望它对更多行有效。我已将数据存储在 pd.DataFrame.
中有没有比蛮力更有效的比较方法?
谢谢
首先,你试过什么代码?
但是要删除重复项,这在 pandas 中非常容易。示例如下:
import pandas as pd
import numpy as np
# Creating the Test DataFrame below -------------------------------
dfp = pd.DataFrame({'A' : [np.NaN,np.NaN,3,4,5,5,3,1,5,np.NaN],
'B' : [1,0,3,5,0,0,np.NaN,9,0,0],
'C' : ['AA1233445','A9875', 'rmacy','Idaho Rx','Ab123455','TV192837','RX','Ohio Drugs','RX12345','USA Pharma'],
'D' : [123456,123456,1234567,12345678,12345,12345,12345678,123456789,1234567,np.NaN],
'E' : ['Assign','Unassign','Assign','Ugly','Appreciate','Undo','Assign','Unicycle','Assign','Unicorn',]})
print(dfp)
#Output Below----------------
A B C D E
0 NaN 1.0 AA1233445 123456.0 Assign
1 NaN 0.0 A9875 123456.0 Unassign
2 3.0 3.0 rmacy 1234567.0 Assign
3 4.0 5.0 Idaho Rx 12345678.0 Ugly
4 5.0 0.0 Ab123455 12345.0 Appreciate
5 5.0 0.0 TV192837 12345.0 Undo
6 3.0 NaN RX 12345678.0 Assign
7 1.0 9.0 Ohio Drugs 123456789.0 Unicycle
8 5.0 0.0 RX12345 1234567.0 Assign
9 NaN 0.0 USA Pharma NaN Unicorn
# Remove all records with duplicated values in column a:
# keep='first' keeps the first occurences.
df2 = dfp[dfp.duplicated(['A'], keep='first')]
#output
A B C D E
1 NaN 0.0 A9875 123456.0 Unassign
5 5.0 0.0 TV192837 12345.0 Undo
6 3.0 NaN RX 12345678.0 Assign
8 5.0 0.0 RX12345 1234567.0 Assign
9 NaN 0.0 USA Pharma NaN Unicorn
如果你想要一个没有重复检查所有列的新数据框,请使用波浪号。 ~
运算符本质上是 not equal to
或 !=
运算符。官方文档 here
df2 = dfp[~dfp.duplicated(keep='first')]