我想要完成的是一个条件检查,它会查看金额列中的值。 如果df ['amount']中的值小于200k,则不执行任何操作。 如果df ['amount']中的值大于或等于200k,则将相应值替换为月份或36.00中的值,具体取决于较大者。
import pandas as pd
df['amount'] = [332374.00, 22250.75, 45282.10, 339720.00, 1100.00, 40000.00, 15000.00, 207820.00, 497432.00]
df['months'] = [18.00, 17.00, 16.00, 46.00, 14.00, 13.00, 13.00, 13.00, 12.00]
df['checks'] = [1.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 1.00, 1.00]
所需的输出是一个如下所示的数据集。
amount months checks
332374.00 36.00 1.00
22250.75 17.00 0.00
45282.10 16.00 0.00
339720.00 46.00 1.00
1100.00 14.00 0.00
40000.00 13.00 0.00
15000.00 13.00 0.00
207820.00 36.00 1.00
497432.00 36.00 1.00
答案 0 :(得分:3)
pd.Series.mask
允许您在True
参数中传递的cond
值的位置屏蔽系列的值。您还可以传递other
参数来提供值以替换被屏蔽的值。我使用np.maximum
生成other
值。
df.assign(months=df.months.mask(df.amount.ge(2E5), np.maximum(df.months, 36)))
amount months checks
0 332374.00 36.0 1.0
1 22250.75 17.0 0.0
2 45282.10 16.0 0.0
3 339720.00 46.0 1.0
4 1100.00 14.0 0.0
5 40000.00 13.0 0.0
6 15000.00 13.0 0.0
7 207820.00 36.0 1.0
8 497432.00 36.0 1.0
另请参阅pd.Series.where
,因为我们可以执行相同的任务:
df.assign(months=df.months.where(df.amount.lt(2E5), np.maximum(df.months, 36)))
amount months checks
0 332374.00 36.0 1.0
1 22250.75 17.0 0.0
2 45282.10 16.0 0.0
3 339720.00 46.0 1.0
4 1100.00 14.0 0.0
5 40000.00 13.0 0.0
6 15000.00 13.0 0.0
7 207820.00 36.0 1.0
8 497432.00 36.0 1.0
我们也可以使用相同的逻辑执行此任务,但使用numpy.where
a = df.amount.values
m = df.months.values
df.assign(months=np.where(a < 2E5, m, np.maximum(m, 36)))
amount months checks
0 332374.00 36.0 1.0
1 22250.75 17.0 0.0
2 45282.10 16.0 0.0
3 339720.00 46.0 1.0
4 1100.00 14.0 0.0
5 40000.00 13.0 0.0
6 15000.00 13.0 0.0
7 207820.00 36.0 1.0
8 497432.00 36.0 1.0
答案 1 :(得分:3)
您可以使用loc
查找金额超过200k阈值且月数小于36的实例。然后将这些值设置为36。
df.loc[(df['amount'] >= 200000) & (df['months'] < 36), 'months'] = 36
>>> df
amount months checks
0 332374.00 36 1
1 22250.75 17 0
2 45282.10 16 0
3 339720.00 46 1
4 1100.00 14 0
5 40000.00 13 0
6 15000.00 13 0
7 207820.00 36 1
8 497432.00 36 1
<强>计时强>
使用assign
会比较慢,因为您必须复制整个数据帧然后分配新列。使用loc
会更快。
以下是这个小数据集的时间安排:
%timeit df.assign(months=df.months.mask(df.amount.ge(2E5), np.maximum(df.months, 36)))
# 1000 loops, best of 3: 1.01 ms per loop
%timeit df.loc[(df['amount'] >= 200000) & (df['months'] < 36), 'months'] = 36
# 1000 loops, best of 3: 838 µs per loop