Если утверждение о ячейке в панде дает «Истинное значение Серии неоднозначно» - PullRequest
0 голосов
/ 14 марта 2019

У меня есть CSV-файл, который я конвертирую в панду в Python 3.7.Затем я хочу проверить, имеют ли определенные ячейки значение NaN (т.е. в моем случае они пустые), и только в этом случае я хочу заменить содержимое ячейки другим значением.

Я выбираю ячейку со значениями внутри других ячеек в других столбцах (столбцы family_name и first_name) в той же строке.Вот MWE:

import csv
import pandas as pd
import numpy as np
df = pd.DataFrame({"family_name":["smith", "duboule", "dupont"], "first_name":["john","jean-paul", "luc"], "weight":[70, 85, pd.np.nan]})
value_to_replace = 90
if df["weight"][(df["family_name"] == "dupont") & (df["first_name"] == "luc")] == pd.np.nan:
    df["weight"][(df["family_name"] == "dupont") & (df["first_name"] == "luc")] = value_to_replace

Я получаю следующую ошибку:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mymac/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py", line 1576, in __nonzero__
    .format(self.__class__.__name__))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Я также попытался добавить .bool() == True в следующей форме, но я получил ту же ошибкусообщение:

if pd.isna(df["weight"][(df["family_name"] == family_name) & (df["first_name"] == first_name)]).bool() == True:
    df["weight"][(df["family_name"] == "dupont") & (df["first_name"] == "luc")] = value_to_replace

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

Использование np.where

Работает следующим образом: np.where(condition, true value, false value)

df['weight'] = np.where((df.family_name == 'dupont') & (df.first_name == 'luc'), value_to_replace, df.weight)

print(df)
  family_name first_name  weight
0       smith       john    70.0
1     duboule  jean-paul    85.0
2      dupont        luc    90.0

Редактировать после комментария ОП
Только если вес NaN, вы можете использовать .isnull:

df['weight'] = np.where((df.family_name == 'dupont') & (df.first_name == 'luc') & (df.weight.isnull()), value_to_replace, df.weight)
1 голос
/ 14 марта 2019

удалите все ваши операторы if и используйте это

df.loc[ (df["family_name"] == "dupont") & 
        (df["first_name"] == "luc") & 
        (df["weight"].isnull()), 'weight'] = value_to_replace

Я предлагаю вам прочитать pandas API , чтобы узнать, как loc выбирать / редактировать данные

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