根据多种条件替换熊猫数据框中的值

时间:2019-05-04 06:45:22

标签: python pandas

我有以下数据框:

+----+----+---------+----------+
|    |A   |   B     |   C      |
|----+----+---------+----------|
|  0 |S   |   nan   |   5464.5 |
|  1 |A   |  5464.5 |   5464.5 |
|  2 |A   |  5675.5 |    nan   |
|  3 |S   |  5670   |    nan   |
|  4 |A   |  5664   |    nan   |
|  5 |B   |  5635.5 |    nan   |
|  6 |D   |  5624   |    nan   |
|  7 |C   |  5624   |    nan   |
|  8 |X   |   nan   |   5464.5 |
|  9 |C   |  5715.5 |    nan   |
| 10 |D   |  4704   |   5000   |
+----+----+---------+----------+

我想用条件替换B中的nan值和B <5000中的值: 如果列A为“ S”,则应将其替换为列C 如果列A为“ X”,则应将其替换为列C + 10 如果A列为'D',则应将其替换为C-10列

因此结果应如下所示:

+----+----+---------+----------+
|    |A   |   B     |   C      |
|----+----+---------+----------|
|  0 |S   |  5464.5 |   5464.5 |
|  1 |A   |  5464.5 |   5464.5 |
|  2 |A   |  5675.5 |    nan   |
|  3 |S   |  5670   |    nan   |
|  4 |A   |  5664   |    nan   |
|  5 |B   |  5635.5 |    nan   |
|  6 |D   |  5624   |    nan   |
|  7 |C   |  5624   |    nan   |
|  8 |X   |  5474.5 |   5464.5 |
|  9 |C   |  5715.5 |    nan   |
| 10 |D   |  4704   |   4990   |
+----+----+---------+----------+

解决此问题的最优雅,最简单和可读的方法是什么。我倾向于遍历表格并进行更改,但我会发现很多警告,请不要这样做。

2 个答案:

答案 0 :(得分:1)

您可以使用&|运算符组合多个条件,然后使用.loc方法选择根据条件过滤的数据。

需要注意两个事项: 1.使用.values获取分配给数据帧的值。 2.使用==运算符时不要忘记括号。

index = df['B'].isna()|(df['B']<5000)

index_1 = index & (df['A']=='S')
df.loc[index_1, 'B'] = df.loc[index_1, 'C'].values

index_2 = index & (df['A']=='X')
df.loc[index_2, 'B'] = (df.loc[index_1, 'C']+10).values

index_3 = index & (df['A']=='D')
df.loc[index_3, 'B'] = (df.loc[index_1, 'C']-10).values

答案 1 :(得分:0)

我不知道它有多优雅,但是它可以工作:

df2 = df.copy()

df2.B[((df2.A=='S')&(df2.B.isna()))|((df2.A=='S')&(df2.B<5000))]=df2.C
df2.B[((df2.A=='X')&(df2.B.isna()))|((df2.A=='X')&(df2.B<5000))]=df2.C+10
df2.B[((df2.A=='D')&(df2.B.isna()))|((df2.A=='D')&(df2.B<5000))]=df2.C-10

此外,请确保您使用的是初始DataFrame的副本,以防万一this answer.