Как правильно выбрать строки панды по условию столбца, для расчета - PullRequest
0 голосов
/ 21 сентября 2018

Я не понимаю поведение панд в этой ситуации.Очевидно, проблема в строке 3, где столбец A имеет отрицательное значение, и это приводит к математической проблеме с попыткой поднять его на дробную мощность.

Я ограничил строки, где я хочу, чтобы эта np.power запускалась по условиюA> 1 с использованием df.loc.И из полученного NaN в строке 0, столбце C, очевидно, что фильтр работает нормально, и все значения в результирующем кадре данных соответствуют ожидаемым, но я получил ошибку, потому что np.power, очевидно, все еще вычисляет строку 3 по некоторым причинам.

Можете ли вы помочь мне понять, почему это происходит и как я могу улучшить код, чтобы избежать ошибок?

data = [{'A': 1, 'B': 10},
         {'A': 2, 'B': 10},
         {'A': 3, 'B': 10},
         {'A': -1,  'B': 10}]

df = pd.DataFrame(data)
df
Out[4]: 
   A   B
0  1  10
1  2  10
2  3  10
3 -1  10

df['C'] = df.loc[df.A > 1, 'A'] * np.power(df['A'],0.3)
df
/home/meteoadriatic/.local/lib/python3.5/site-packages/ipykernel_launcher.py:1: RuntimeWarning: invalid value encountered in power
  """Entry point for launching an IPython kernel.
Out[5]: 
   A   B         C
0  1  10       NaN
1  2  10  2.462289
2  3  10  4.171168
3 -1  10       NaN

1 Ответ

0 голосов
/ 21 сентября 2018

Когда вы делаете

np.power(df['A'],0.3)

df['A'] по-прежнему относится ко всему столбцу.

Вместо этого вы можете сделать это, используя mul, чтобы избежать предупреждения:

df['C'] = np.power(df.loc[df.A > 1, 'A'], 0.3).mul(df.A)

>>> df
   A   B         C
0  1  10       NaN
1  2  10  2.462289
2  3  10  4.171168
3 -1  10       NaN

Другой вариант - выбрать снова:

df['C'] = df.loc[df.A > 1, 'A'] * np.power(df.loc[df.A>1,'A'],0.3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...