Python pandas数据帧'SUMIF' - 条件范围与总和范围不同[关闭]

问题描述 投票:0回答:1

我有关于Pandas DataFrame计算的问题。

我需要一个遵循Excel中SUMIF函数逻辑的代码(CriteriaCriteria_RangeSum_Range)。

我有一个df_Crit(1列),然后我有一个df_crit_rng(包含10列)和一个df_sum_rng(10列)。全部具有相同的长度(取决于最多4 mio行的文件)。

以下是前5列标准和总和范围的数据片段(遗憾的是,bid4和bid5不可见):

                       |-------------crit_range---------|  |---sum range-------|
            crit       bidp1  bidp2  bidp3  bidp4  bidp5  bids1  bids2  bids3  \
0        3584.707646   3586   3585   3584   3583   3582    239    638    301   
1        3584.707646   3586   3585   3584   3583   3582    239    638    301   
2        3584.707646   3586   3585   3584   3583   3582    240    638    301   
3        3584.707646   3586   3585   3584   3583   3582    240    638    301   
4        3584.707646   3586   3585   3584   3583   3582    240    638    301   
5        3584.707646   3586   3585   3584   3583   3582    240    638    301   
...              ...    ...    ...    ...    ...    ...    ...    ...    ...   
1078486  3593.203398   3594   3593   3592   3591   3590    604    663    649   
1078487  3593.203398   3594   3593   3592   3591   3590    604    663    649

现在该函数应该检查:

if df_crit <= df_criteria_range

然后将df_sum_rng汇总到df_critera_range语句为真的列。

对于第0行意味着,它应该总和bids1 + bids2,因为bidp1bidp2大于该行中的标准。

最后,它应该使用该计算创建CSV outfile。

这样做的祸害是什么?我想我需要一个有效的方法,而不是循环数据帧,因为文件很大?

python pandas dataframe conditional-statements
1个回答
1
投票

你可以通过创建一个布尔掩码并将掩码为True的值相加来实现:

说这些是感兴趣的列:

bidp = df[['bidp1', 'bidp2', 'bidp3']]
bids = df[['bids1', 'bids2', 'bids3']]

bids构建一个掩码:

mask = pd.concat([bidp[column] > df.crit for column in bidp], axis=1, keys=bids.columns)

面具,填充0,其中面具是False和列相加:

result = bids[mask].fillna(0).sum(axis=1)

这是bids值超过bidpcrit值之和的列。您可以将其添加到数据框并将结果保存到csv:

df['conditional_sum'] = result
df.to_csv('file.csv')
© www.soinside.com 2019 - 2024. All rights reserved.