如何根据其他某些列的条件用另一列的值填充一列?

时间:2018-12-28 01:53:15

标签: python python-3.x pandas dataframe

假设我们在熊猫中有一个数据框,如下所示:

col1 | col2 | col3 | col4 
22   | Nan  | 23   |  56
12   |  54  | 22   |  36
48   | Nan  | 2    |  45
76   | 32   | 13   |  6
23   | Nan  | 43   |  8
67   | 54   | 56   |  64
16   | 32   | 32   |  6
3    | 54   | 64   |  8
67   | 4    | 23   |  64

如果col4col1不是col4<col1,我想用col2替换NaN的值

所以结果应该是

col1 | col2 | col3 | col4 
22  | Nan   | 23   |  56
12  |  54   | 22   |  36
48  | Nan   | 2    |  45
76  | 32    | 13   |  76
23  | Nan   | 43   |  8
67  | 54    | 56   |  67
16  | 32    | 32   |  16
3   | 54    | 64   |  8
67  | NaN   | 23   |  64

我尝试了以下代码

df.loc[((df['col4'] < df['col1']) & (pd.notnull(df['col2']))), ['col4']] = df.loc['col1']

问题出在等号后面。有人知道如何解决该问题吗?

4 个答案:

答案 0 :(得分:2)

使用此:

df.loc[(df['col1']>df['col4'])&(df['col2'].notnull()),'col4']=df['col1']

现在:

print(df)

是:

   col1  col2  col3  col4
0    22   NaN    23    56
1    12  54.0    22    36
2    48   NaN     2    45
3    76  32.0    13    76
4    23   NaN    43     8
5    67  54.0    56    67
6    16  32.0    32    16
7     3  54.0    64     8
8    67   4.0    23    67

答案 1 :(得分:1)

未经测试,但是那又如何呢?

df[(df['col4'] < df['col1']) & (pd.notnull(df['col2'])), 'col4'] = df['col1']

答案 2 :(得分:1)

这是一个经过验证的解决方案:

idx_ = df[(df['col4'] < df['col1']) & (pd.notnull(df['col2']))].index
df.loc[idx_,'col4'] = df['col1']
df


+---+------+------+------+------+
|   | col1 | col2 | col3 | col4 |
+---+------+------+------+------+
| 0 |   22 | NaN  |   23 |   56 |
| 1 |   12 | 54.0 |   22 |   36 |
| 2 |   48 | NaN  |    2 |   45 |
| 3 |   76 | 32.0 |   13 |   76 |
| 4 |   23 | NaN  |   43 |    8 |
| 5 |   67 | 54.0 |   56 |   67 |
| 6 |   16 | 32.0 |   32 |   16 |
| 7 |    3 | 54.0 |   64 |    8 |
| 8 |   67 | 4.0  |   23 |   67 |
+---+------+------+------+------+

答案 3 :(得分:1)

这里有点逻辑,我将其更改为更清晰的方式解决您的问题。

df['col4'].update(df.loc[df.col2.notna(),['col1','col4']].max(1))
df
   col1 col2  col3  col4
0    22  NaN    23    56
1    12   54    22    36
2    48  NaN     2    45
3    76   32    13    76
4    23  NaN    43     8
5    67   54    56    67
6    16   32    32    16
7     3   54    64     8
8    67    4    23    67