【问题标题】:Working with big dataset in pandas在 pandas 中使用大数据集
【发布时间】:2018-05-03 01:10:49
【问题描述】:

我一直在使用这个数据集:https://www.kaggle.com/nsharan/h-1b-visa
我已将主数据框分为两部分:
soc_null 数据框 - 其中 SOC_NAME 列具有 NaN 值
soc_not_null - 其中 SOC_NAME 列具有 NaN 以外的值
为了在 soc_null 数据框的 SOC_NAME 列中填充 NaN 值,我想出了以下代码:

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 复杂性代码完全在一台机器上。
我相信必须有更好的方法来做到这一点,并且可能比我的数据集更大,因为在清理过程之后还有其他几个部分需要两个循环进行处理.

【问题讨论】:

  • pandasnumpy 数据结构不是为 python 级迭代设计的,您应该应用矢量化的 pandas 方法和/或 numpy 函数。如果您确实想坚持您的解决方案,请考虑使用numba 或在Cython 中重新实现它。

标签: python python-3.x pandas bigdata data-science


【解决方案1】:

有一些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-each 循环。使用 Pandas.DataFrame 和其他优化的东西。

【讨论】:

    猜你喜欢
    • 2017-10-09
    • 2018-12-14
    • 2014-02-11
    • 2017-11-24
    • 2015-11-15
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    相关资源
    最近更新 更多