您好我正在进行数据转换项目。我正在接收具有100万条记录的csv
,并尝试将它们分隔为单独的txt
个文件。问题是需要花费大量时间来处理。我们在这里谈论每列5分钟。我的代码如下:
import pandas as pd
print("Reading CSV")
data_set = pd.read_csv(address_file_path, low_memory=False, index_col=1)
print("Reading Completed")
a_name = set(data_set.loc[:, 'A'])
print("A done")
b_name = set(data_set.loc[:, 'B'])
print("B Done")
c_name = set(data_set.loc[:, 'C'])
print("C Done")
d_name = set(data_set.loc[:, 'D'])
print("D done")
e_name = set(data_set.loc[:, 'E'])
print("E done")
f_name = set(data_set.loc[:, 'F'])
print("F done")
print("Data Transformed")
考虑到Pandas.Series
有100万条记录但是重复是这样的,但事实证明只有36条记录但是它会卡住我甚至不确定代码是否完成,因为我没有&现在看到它结束了。
如何优化它以更快地工作?
Unnamed: 0 1
A NaN
B Job Applicant;UP
C USA
D California
E Alice neh tratma
F Bharuhana
I NaN
J NaN
K SH 5
L NaN
M NaN
N NaN
O NaN
P NaN
Q NaN
答案 0 :(得分:2)
我认为你遇到了这个问题:
In [17]: s = pd.Series([np.nan]*3)
In [18]: set(s)
Out[18]: {nan, nan, nan}
In [19]: s[0]
Out[19]: nan
In [20]: s[0] is s[1]
Out[20]: False
nan可能是一个古怪的小野兽,因为它不等于它本身,并且在这种情况下,返回的值甚至彼此不相同。这是哈希查找的一个可怕案例。
手动删除nans或使用.unique()
。之后
df = pd.DataFrame(np.random.random((10**6,6)))
df.iloc[::2] = np.nan
我得到了
In [26]: %time z = set(df[0].dropna())
CPU times: user 128 ms, sys: 40 ms, total: 168 ms
Wall time: 174 ms
In [27]: %time z = df[0].unique()
CPU times: user 72 ms, sys: 12 ms, total: 84 ms
Wall time: 88.9 ms
我放弃了等待set(df[0])
完成。
通常,您将要避免混合使用Python级别和numpy / pandas级别的函数。即使在你没有遇到这种奇怪的角落的情况下,后者往往会更快。
在您的代码中,您可以
set(data_set.loc[:, 'A'].unique())
如果你想保留NaN或set(data_set.loc[:, 'A'].dropna().unique())
,如果你不想。出于许多目的,您甚至不需要转换为集合,但如果您对其方法更熟悉,则可以保留它。