Сравнение значений кадра данных - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть такой фрейм данных

enter image description here

Я хочу сравнить a с c и b с d. Когда есть значение nan или пустое значение, оно будет рассматриваться как 0. enter image description here

Я пытался использовать списочное понимание, но получил The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

df['bVsd']=["True" if df['b']==df['d'] else "False"] 

1 Ответ

3 голосов
/ 06 апреля 2020

ДОБАВЛЕННЫЙ ОТВЕТ НА ВАШ 2-Й ВОПРОС

Чтобы достичь того, что вы хотите сделать, просто сравните столбцы напрямую:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':[1,3,5,7,9],
                   'b':[0,0,0,0,0],
                   'c':[1,3,5,7,9],
                   'd':[0,np.nan,np.nan,0,np.nan]})

# Fill the nan and empty cells with 0
df = df.fillna(0)

# To do the comparison you desire
df['aVsc'] = (df['a'] == df['c'])
df['bVsc'] = (df['b'] == df['d'])

Причина, по которой вы получаете ошибка в том, что df['b'] == df['d'] возвращает вам серию:

    0
0   True
1   True
2   True
3   True
4   True

, и, следовательно, невозможно оценить логическое значение ряда, если вы не укажете any или all, что не будет делать то, что вы хотите в любом случае.

И, наконец, в отдельном примечании, это был неправильный способ сделать список понятным. У него должен быть итератор, и вам нужно l oop поверх итератора. Примерно так: [True if i == 'something' else False for i in iterator].

2-й вопрос

Если вы хотите, чтобы df['aVsc] было 0, когда df['a'] == df['c'], и df['aVsc] == df['a'] в противном случае, вы можете используйте np.where:

df['aVsc'] = np.where(df['a'] == df['c'], 0, df['a'])

, в котором функция np.where означает проверку, если условие df['a'] == df['c'] равно True, если это так, присвойте значение 0, назначьте значение df['a'].

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