Python 优化系列到集合的转换

Python 优化系列到集合的转换,python,pandas,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(d

嗨,我在做一个数据转换项目。我正在接收一个有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")
考虑到《熊猫》系列有100万条记录,但重复次数太多,结果只有36条记录,但它被卡住了。我甚至不确定代码是否完成,因为我现在还没有看到它正常运行。 我如何优化它以更快地工作



我认为你遇到了这个问题:

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可能是一个古怪的小怪物,因为它不等于它自己,在这个上下文中,返回的值甚至不完全相同。对于哈希查找来说,这是一个糟糕的情况

手动删除NAN或使用
.unique()
。之后

df = pd.DataFrame(np.random.random((10**6,6)))
df.iloc[::2] = np.nan
我明白了

我放弃了等待
set(df[0])
完成

通常,您希望避免混合使用Python级别和numpy/pandas级别的函数。即使在你没有碰到这个奇怪的角落的情况下,后者也会更快

在代码中,您可以

set(data_set.loc[:, 'A'].unique())

如果要保留NaN或
集合(data_set.loc[:,'A'].dropna().unique())
,如果不保留。出于许多目的,您甚至不需要转换为集合,但如果您更熟悉集合的方法,您可以保留它。

我认为您遇到了这个问题:

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可能是一个古怪的小怪物,因为它不等于它自己,在这个上下文中,返回的值甚至不完全相同。对于哈希查找来说,这是一个糟糕的情况

手动删除NAN或使用
.unique()
。之后

df = pd.DataFrame(np.random.random((10**6,6)))
df.iloc[::2] = np.nan
我明白了

我放弃了等待
set(df[0])
完成

通常,您希望避免混合使用Python级别和numpy/pandas级别的函数。即使在你没有碰到这个奇怪的角落的情况下,后者也会更快

在代码中,您可以

set(data_set.loc[:, 'A'].unique())

如果要保留NaN或
集合(data_set.loc[:,'A'].dropna().unique())
,如果不保留。出于许多目的,您甚至不需要转换为集合,但如果您更熟悉集合的方法,您可以保留它。

如果您只对文件进行写入,请尝试
pd.unique
,这比集合生成器更快。@ayhan我只是将Pandas.Series传递给它?是的。
pd.unique(df['A'])
df['A'].unique()
。当然,你也可以继续使用loc。@ayhan但是如果我想在写下它之前对它执行一些操作怎么办?例如,如果我想根据“;”分割一些项目然后将其写入文件。那么我该怎么做呢?@iam.Carrot看看这个问题,如果你只是在写一个文件,那可能会有帮助,试试
pd.unique
,它比set builder快。@ayhan我刚刚把Pandas.Series传给它了?是的。
pd.unique(df['A'])
df['A'].unique()
。当然,你也可以继续使用loc。@ayhan但是如果我想在写下它之前对它执行一些操作怎么办?例如,如果我想根据“;”分割一些项目然后将其写入文件。那我该怎么办?@iam.Carrot看看这个问题,它可能会很有帮助!您是否能够编辑我的问题中的一行代码,因为我对python环境有点陌生。这将是一个很大的帮助,我们也可以做
set(df[“0”].astype(str))
,因为OP有对象列,尽管它不能打败
unique()
太棒了!它工作得很好。谢谢你的帮助。我会记住的。手动删除
NaN
并不是件好事,因为我希望我的代码不受这些数据集的影响。
unique()。我没有得到
.dropna().unique()
,因为它有什么用途?呃,
dropna
会删除NaN,否则你的集合中会有一个NaN,而不仅仅是字符串。太好了!您是否能够编辑我的问题中的一行代码,因为我对python环境有点陌生。这将是一个很大的帮助,我们也可以做
set(df[“0”].astype(str))
,因为OP有对象列,尽管它不能打败
unique()
太棒了!它工作得很好。谢谢你的帮助。我会记住的。手动删除
NaN
并不是件好事,因为我希望我的代码不受这些数据集的影响。
unique()。我没有得到
.dropna().unique()
,它的用途是什么?呃,
dropna
会删除NaN,否则你的集合中会有一个NaN,而不仅仅是字符串。