嵌套用于循环和条件熊猫替换

时间:2019-11-10 21:58:32

标签: python pandas for-loop nested runtime

我有两个不同的熊猫数据框,其中第一个数据框(价格)中有两列。第一列名为value的值中包含一些值,第二列金额具有每个价格的可用金额。第二数据帧(仓)具有从价格数据帧产生的一些价格区间作为索引。对于价格数据框的每一行,我检查值列的每一行,以查找其与仓位数据框所属的间隔,如果该值在一个间隔中,则在仓位数据框中分配可用量。如果在相同的时间间隔内又有另一个值,我将在group_bins数据帧中将这些量求和。

import pandas as pd

bins = pd.DataFrame({
    'value': [1, 2, 5, 7, 8, 16, 20, 3, 9, 11, 35, 12, 54, 33, 3, 22, 23]
})

price = pd.DataFrame({
    'value': [2, 5, 7, 8, 16, 20, 3, 9, 11, 2.5, 3.4],
    'amount': [50, 112, 130, 157, 146, 148, 300, 124, 151, 100, 32]
})

bins['bins'] = pd.qcut(bins['value'], 12)
group_bins = bins.groupby(['bins']).sum()
group_bins['amount'] = 0
del group_bins['value']

for j in range(price.shape[0]):
    for i in range(group_bins.shape[0]):
        if price.loc[j, 'value'] in group_bins.index[i]:
            group_bins.loc[group_bins.index[i], 'amount'] += price.loc[j, 'amount']

            break

预期结果:

                 amount
bins                    
(0.999, 2.333]        50
(2.333, 3.0]         400
(3.0, 5.0]           144
(5.0, 7.333]         130
(7.333, 8.667]       157
(8.667, 11.0]        275
(11.0, 13.333]         0
(13.333, 18.667]     146
(18.667, 22.0]       148
(22.0, 26.333]         0
(26.333, 34.333]       0
(34.333, 54.0]         0

我的问题是我有10万个数据,所有这些过程花费的时间太长。 是否有任何优雅且快捷的方法来替换这些嵌套的for循环和if条件?

预期结果是group_bins数量列中的最后一列。任何帮助将非常感激!谢谢。

1 个答案:

答案 0 :(得分:0)

如果在数据帧上使用for循环,则您有99%的时间做错了。尝试以下方法:

bins = pd.DataFrame({
    'value': [1, 2, 5, 7, 8, 16, 20, 3, 9, 11, 35, 12, 54, 33, 3, 22, 23]
})
bins['bins'] = pd.qcut(bins['value'], 12)

price = pd.DataFrame({
    'value': [2, 5, 7, 8, 16, 20, 3, 9, 11],
    'amount': [50, 112, 130, 157, 146, 148, 300, 124, 151]
})

price.merge(bins, how='left', on='value') \
    .groupby('bins') \
    .agg({'amount': 'sum'})

结果:

                  amount
bins                    
(0.999, 2.333]        50
(2.333, 3.0]         600
(3.0, 5.0]           112
(5.0, 7.333]         130
(7.333, 8.667]       157
(8.667, 11.0]        275
(11.0, 13.333]         0
(13.333, 18.667]     146
(18.667, 22.0]       148
(22.0, 26.333]         0
(26.333, 34.333]       0
(34.333, 54.0]         0