Как поместить значения другого столбца, если значение ячейки -1 в Pandas Python - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть два столбца, например:

row1   row2
0      500
1400   -1
1330   -1
0      900
500    -1

Здесь, если значение строки 1 равно 0, тогда значение строки 2 не равно -1.Если значение строки 2 равно -1, значение строки 1 не равно 0.

Я хочу создать новую строку, подобную этой:

row3
500 
1400
1330
900
500

В этой строке, если значение строки 1 равно 0,тогда это значение заменяется на row2.Как мне это сделать?

Ответы [ 5 ]

0 голосов
/ 17 декабря 2018

Вы можете использовать pandas 'функцию loc:

df['row3'] = df.row1
df.loc[df.row3 == 0, 'row3'] = df.row2

Получение:

|   | row1 | row2 | row3 |
|---|------|------|------|
| 0 | 0    | 500  | 500  |
| 1 | 1400 | -1   | 1400 |
| 2 | 1330 | -1   | 1400 |
| 3 | 0    | 900  | 900  |
| 4 | 500  | -1   | 500  |
0 голосов
/ 17 декабря 2018

Мои 5 центов

df.replace(-1,0).sum(1)
Out[338]: 
0     500
1    1400
2    1330
3     900
4     500
dtype: int64
0 голосов
/ 17 декабря 2018

clip_lower + sum

Предполагая, что ваш DataFrame не имеет отрицательных значений, ...

df['row3'] = df.clip_lower(0).sum(1)    
df
   row1   row2    row3
0     0  500.0   500.0
1  1400    NaN  1400.0
2  1330    NaN  1330.0
3     0  900.0   900.0
4   500    NaN   500.0

mask + combine_first

df.row2.mask(df.row2.eq(-1)).combine_first(df.row1)

0     500.0
1    1400.0
2    1330.0
3     900.0
4     500.0
Name: row2, dtype: float64

Маскировка + Series.add

df.loc[df.row2 == -1, 'row2'] = np.nan
df.row2.add(df.row1, fill_value=0)
# Or,
# df.row2.mask(df.row2.eq(-1)).add(df.row1, fill_value=0)

0     500.0
1    1400.0
2    1330.0
3     900.0
4     500.0
dtype: float64
0 голосов
/ 17 декабря 2018

Простое понимание списка сделает:

import pandas as pd

data = [[0, 500],
        [1400, -1],
        [1330, -1],
        [0, 900],
        [500, -1]]


df = pd.DataFrame(data=data, columns=["row1", "row2"])
df["row3"] = [r1 if r2 == -1 else r2 for r1, r2 in zip(df.row1, df.row2)]

print(df)

Вывод

   row1  row2  row3
0     0   500   500
1  1400    -1  1400
2  1330    -1  1330
3     0   900   900
4   500    -1   500
0 голосов
/ 17 декабря 2018

Вы можете использовать numpy.where (который я бы предпочел назвать numpy.if_then_else).

>>> df['row3'] = np.where(df['row2'] == -1, df['row1'], df['row2'])                                                    
>>> df                                                                                                                 
   row1  row2  row3
0     0   500   500
1  1400    -1  1400
2  1330    -1  1330
3     0   900   900
4   500    -1   500

В качестве альтернативы, немного более краткий, но очень контекст, специфичный для настройкина ваш вопрос:

>>> df['row3'] = np.where(df['row1'], df['row1'], df['row2'])                                                          
>>> df                                                                                                                 
   row1  row2  row3
0     0   500   500
1  1400    -1  1400
2  1330    -1  1330
3     0   900   900
4   500    -1   500

Сроки:

>>> df = pd.concat([df]*1000)
>>> df_c = df.copy()                                                                                          
>>> %timeit df.clip_lower(0).sum(1) # coldspeed 1                                                                      
537 µs ± 5.17 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
>>> %timeit df.row2.mask(df.row2.eq(-1)).combine_first(df.row1) # coldspeed 2                                          
964 µs ± 15.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
>>> %timeit df_c.loc[df_c.row2 == -1, 'row2'] = np.nan; df_c.row2.add(df_c.row1, fill_value=0) # coldspeed 3                   
2.66 ms ± 24.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
>>> %timeit [r1 if r2 == -1 else r2 for r1, r2 in zip(df.row1, df.row2)] # Daniel Mesejo                               
466 µs ± 1.79 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
>>> %timeit df.replace(-1,0).sum(1) # W-B                                                                              
783 µs ± 45.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)    
>>> %timeit np.where(df['row2'] == -1, df['row1'], df['row2']) # timgeb 1                                              
173 µs ± 4.29 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)    
>>> %timeit np.where(df['row1'], df['row1'], df['row2']) # timgeb 2                                                    
38.1 µs ± 3.69 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...