我有以下数据框:
+----+----+---------+----------+
| |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 |
+----+----+---------+----------+
解决此问题的最优雅,最简单和可读的方法是什么。我倾向于遍历表格并进行更改,但我会发现很多警告,请不要这样做。
答案 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.