用条件替换数据帧值

时间:2017-09-28 23:16:52

标签: python python-3.x pandas

我想要完成的是一个条件检查,它会查看金额列中的值。 如果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

2 个答案:

答案 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