我对Pandas DataFrame计算有疑问。
我需要一个遵循Excel中SUMIF函数逻辑的代码
(Criteria
,Criteria_Range
,Sum_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
,因为bidp1
和bidp2
大于该行中的条件。
最后,它应使用该计算创建CSV输出文件。
什么是熊猫的方法?我想我需要一种有效的方法来避免循环浏览数据帧,因为文件很大?
答案 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