优化Pandas.series转换为一组

时间:2018-01-08 16:04:56

标签: python pandas

您好我正在进行数据转换项目。我正在接收具有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

1 个答案:

答案 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()),如果你不想。出于许多目的,您甚至不需要转换为集合,但如果您对其方法更熟悉,则可以保留它。