【问题标题】:Adding Calculated Field in DataFrame在 DataFrame 中添加计算字段
【发布时间】:2016-11-26 13:38:58
【问题描述】:

我想在名为result 的现有DataFrame 中创建一个名为str_bos 的列。我有以下列-'str_nbr', 'ZIP Sales', 'str_Sales', 'ZIP_Distinct #', 'ZIP_Share_of_Str_Sales', 'Counter', 'Str_BOS_Cum%', 'Str_Sales_Rank'

这是我想出的。但是,需要2个小时才能完成。但是,其他操作(如排序、合并等)需要几秒钟。我在这里缺少什么?

def str_bos(row):
    if row['str_sales_rank'] == 1 or row['str_bos_cum%'] <= 0.1:
        return 1
    elif row['str_bos_cum%'] <= 0.2:
        return 2
    elif row['str_bos_cum%'] <= 0.3:
        return 3
    elif row['str_bos_cum%'] <= 0.4:
        return 4
    elif row['str_bos_cum%'] <= 0.5:
        return 5
    elif row['str_bos_cum%'] <= 0.6:
        return 6
    elif row['str_bos_cum%'] <= 0.7:
        return 7
    elif row['str_bos_cum%'] <= 0.8:
        return 8
    elif row['str_bos_cum%'] <= 0.9:
        return 9
    else:
        return 10

result['str_bos'] = result.apply(lambda row: str_bos(row), axis=1)

【问题讨论】:

  • 您的代码运行缓慢的原因是.apply 方法遍历每一行,而矢量化方法一次对整个列进行计算。在 pandas 中,您需要避免迭代行——几乎可以保证它的性能很差。这个博客有很好的解释(迭代、应用和向量化部分):tomaugspurger.github.io/modern-4-performance.html

标签: python function pandas calculated-columns


【解决方案1】:

我会在这里使用cut() 方法:

In [21]: df = pd.DataFrame(np.random.rand(10), columns=['A'])

In [22]: df
Out[22]:
          A
0  0.513425
1  0.973631
2  0.549615
3  0.747600
4  0.099415
5  0.737613
6  0.885567
7  0.720187
8  0.446683
9  0.434688

In [23]: df['str_bos'] = pd.cut(df.A, bins=np.arange(0, 1.1, 0.1), labels=np.arange(10)+1)

In [24]: df
Out[24]:
          A str_bos
0  0.513425       6
1  0.973631      10
2  0.549615       6
3  0.747600       8
4  0.099415       1
5  0.737613       8
6  0.885567       9
7  0.720187       8
8  0.446683       5
9  0.434688       5

【讨论】:

    猜你喜欢
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多