我有关于Pandas DataFrame计算的问题。
我需要一个遵循Excel中SUMIF函数逻辑的代码(Criteria
,Criteria_Range
,Sum_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
,因为bidp1
和bidp2
大于该行中的标准。
最后,它应该使用该计算创建CSV outfile。
这样做的祸害是什么?我想我需要一个有效的方法,而不是循环数据帧,因为文件很大?
你可以通过创建一个布尔掩码并将掩码为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
的crit
值之和的列。您可以将其添加到数据框并将结果保存到csv:
df['conditional_sum'] = result
df.to_csv('file.csv')