我一直在使用这个数据集:https://www.kaggle.com/nsharan/h-1b-visa
我已经将主要数据分成两部分:
soc_null dataframe -其中SOC_NAME列有NaN值
soc_not_null -其中SOC_NAME列的值不是NaN
为了在NaN dataframe的SOC_NAME列中填充soc_null值,我编写了以下代码:
for index1, row1 in soc_null.iterrows():
for index2, row2 in soc_not_null.iterrows():
if row1['JOB_TITLE'] == row2['JOB_TITLE']:
soc_null.set_value(index1,'SOC_NAME',row2['SOC_NAME'])这个代码的问题是,soc_null的长度是17734,soc_not_null的长度是2984724,我运行了几个小时,但是只有几百个值被更新了,因此不可能在一台机器上完全执行这个n^2复杂性代码。
我相信必须有更好的方法来做到这一点,可能还有比我的更大的数据集,因为在清理过程之后还有其他几个部分需要两个循环来处理。
发布于 2017-11-19 20:39:10
有一些nice posts可以解释您需要什么。这里有一个解决方案:
import pandas as pd
import numpy as np
values = [
{'JOB_TITLE':'secretary', 'SALARY':30000},
{'JOB_TITLE':'programmer', 'SALARY':60000},
{'JOB_TITLE':'manager', 'SALARY':None},
{'JOB_TITLE':'president', 'SALARY':None},
]
secret_values = [
{'JOB_TITLE':'manager', 'SALARY':150000},
{'JOB_TITLE':'president', 'SALARY':1000000},
]
df = pd.DataFrame(values)
df_secret = pd.DataFrame(secret_values)
df.set_index('JOB_TITLE', inplace=True)
df_secret.set_index('JOB_TITLE', inplace=True)
df.combine_first(df_secret).reset_index()PS:避免在大型数据集中使用for-每个循环。使用Pandas.DataFrame和其他优化的东西。
https://stackoverflow.com/questions/47381459
复制相似问题