Как добавить или объединить два столбца в другой в кадре данных, если они удовлетворяют условию - PullRequest
2 голосов
/ 13 марта 2020

Я новичок в этом, так что это может звучать странно, но в основном у меня большой массив данных, но для упрощения предположим, что это следующий кадр:

import pandas as pd
import numpy as np

dfn = pd.DataFrame({'a':[1,2,3,4,5],
                   'b':[6,7,8,9,10],
                   'c':np.nan})
dfn

Вывод:

    a   b   c
0   1   6   NaN
1   2   7   NaN
2   3   8   NaN
3   4   9   NaN
4   5   10  NaN

То, что я хочу сделать, это заполнить значения в столбце «c» на основе условия, а именно, если соответствующее значение строки в «a» нечетно, то добавить его к соответствующему значению строки » b 'и введите в' c ', в противном случае просто используйте значение' a 'для' c '.

В настоящее время у меня есть следующее:

for row in range(dfn.shape[0]):
    if dfn.loc[row]['a']%2!=0:
        dfn.loc[row]['c']=dfn.loc[row]['a']+dfn.loc[row]['b']
    else:
        dfn.loc[row]['c']=dfn.loc[row]['a']

dfn

Вывод :

    a   b   c
0   1   6   NaN
1   2   7   NaN
2   3   8   NaN
3   4   9   NaN
4   5   10  NaN

Кажется, здесь ничего не происходит, и я не совсем уверен, почему.

Я также попробовал другой подход:

is_odd=dfn[dfn['a']%2!=0]
is_odd['c'] = is_odd['a'] + is+odd['b']

is_odd

Здесь Как ни странно, я получаю правильный вывод:

    a   b   c
0   1   1   2
2   3   3   6
4   5   5   10

Но когда я снова вызываю dfn, он выходит со всеми значениями NaN.

Я также пытался сделать это без использования имени переменной и ничего не происходит.

Есть идеи, что мне не хватает или есть ли способ сделать это?

Спасибо!

Ответы [ 4 ]

1 голос
/ 13 марта 2020

Используйте Series.mod и Series.where, чтобы получить копию столбца b с 0 , где - четное значение в a, затем мы добавляем этот ser ie к a.

dfn['c'] = dfn['b'].where(dfn['a'].mod(2).eq(1), 0).add(dfn['a'])
print(dfn)
   a   b   c
0  1   6   7
1  2   7   2
2  3   8  11
3  4   9   4
4  5  10  15

Альтернатива

dfn['c'] = dfn['a'].mask(dfn['a'].mod(2).eq(1), dfn['a'].add(dfn['b']))
1 голос
/ 13 марта 2020

Используйте numpy, где , что работает для условных выражений. Это похоже на оператор if в python, но значительно быстрее. я редко использую итерроу, поскольку не нахожу его таким же эффективным, как numpy где.

 dfn['c'] = np.where(dfn['a']%2 !=0, 
                     dfn.a + dfn.b,
                     dfn.a)


    a   b   c
0   1   6   7
1   2   7   2
2   3   8   11
3   4   9   4
4   5   10  15

По сути, первая строка в np.where определяет условие ur, которое в данном случае определяет, является ли ' столбец - нечетное число. Если это так, следующая строка выполняется. если это четное число, то выполняется последняя строка. Вы можете думать об этом как о выражении if-else.

0 голосов
/ 13 марта 2020

Вот мое решение, которое близко к оригинальной мысли автора вопроса, надеюсь, оно может быть полезным

def oddadd(x):
    if x['a']%2!=0:
        return x['a']+x['b']
    else:
        return x['a']
dfn["c"] = dfn.apply(oddadd,axis=1)

0 голосов
/ 13 марта 2020

dfn.loc[row]['c']=... всегда неправильно. dfn.loc[row] может быть копией или представлением, поэтому вы не можете знать, что произойдет. правильный способ:

dfn.loc[row, 'c']=...

В любом случае, здесь следует избегать итерации и использовать np.where, как подсказывают другие ответы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...