Python Pandas数据框'SUMIF'-条件范围与和范围不同

时间:2018-09-02 18:01:31

标签: python pandas dataframe conditional-statements

我对Pandas DataFrame计算有疑问。

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

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

以下是标准和总和范围的前5列数据的摘要(不幸的是bids4和bids5不可见):

                       |-------------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输出文件。

什么是熊猫的方法?我想我需要一种有效的方法来避免循环浏览数据帧,因为文件很大?

1 个答案:

答案 0 :(得分: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值超过bidp的{​​{1}}值之和的列。您可以将其添加到数据框中,然后将结果保存到csv:

crit