我有一段工作代码,它读取pandas列并将其唯一值写入字典并将该值映射到整数。
问题在于它的计算效率太低,并且在它完成之前总是被杀死。 我有165列这样的列和每列300,000多行。
示例:
<span th:each="instrumentDescriptor, iterStat : ${instrument.instrumentDescriptors}" th:text="!${iterStat.last} ? ${instrumentDescriptor.instrumentVersion} + ', ': ${instrumentDescriptor.instrumentVersion}"></span>
工作但极其缓慢的代码永远无法完成:
my pandas dataframe df:
A B
cat lion
dog tiger
cat tiger
my output dictionary:
dict['A'] = {'cat':1,'dog',2}
dict['B'] = {'lion':1,'tiger',2}
在终端中,程序会在运行一段时间后自动终止。
如何让这段代码更节省内存?
答案 0 :(得分:0)
您可以将大型数据框拆分为较小的数据框,例如,此方法可以在您可以决定块大小的位置执行此操作:
def splitDataFrameIntoSmaller(df, chunkSize = 10000):
listOfDf = list()
numberChunks = len(df) // chunkSize + 1
for i in range(numberChunks):
listOfDf.append(df[i*chunkSize:(i+1)*chunkSize])
return listOfDf
有块后,可以分别在每个块上应用replace_str函数。
答案 1 :(得分:0)
整个replace_str
函数(其名称实在不太好)可以替换为:
import pandas as pd
def replace_str(col):
return {integer: value_in_df
for integer, value_in_df in enumerate(df[col].unique(), 1)}
df = pd.DataFrame({'a': ['cat', 'dog']})
print(replace_str('a'))
# {1: 'cat', 2: 'dog'}
答案 2 :(得分:0)
看起来您想要对所有非数字列进行分类(分解):
In [15]: df
Out[15]:
ID A B
0 11 cat lion
1 12 dog tiger
2 13 cat tiger
In [16]: for col in not_num_cols:
...: df[col] = pd.factorize(df[col])[0]
...:
In [17]: df
Out[17]:
ID A B
0 11 0 0
1 12 1 1
2 13 0 1