Python 3 / Pandas | Использование функции с инструкциями IF и ELIF для заполнения столбца - PullRequest
0 голосов
/ 05 марта 2020

Python 3 / Pandas

Я пытаюсь использовать функцию для проверки значений различных столбцов в кадре данных и выбрать только значение из столбца, который является не NaN.

Данные структурированы, поэтому существует один основной столбец df['C1'], который я хочу заполнить на основе значения в одном из следующих четырех столбцов, df['C2'], df['C3'], df['C4'] и df['C5']. Когда я наблюдаю данные, я вижу, что в строках df['C2'], df['C3'], df['C4'] и df['C5'] каждый столбец имеет значение NaN, за исключением одного столбца, который имеет текстовое значение. Это верно для всех строк в кадре данных. Я пытаюсь написать функцию, которая будет применяться к фрейму данных, чтобы найти столбец с текстовым значением, и скопировать это значение из столбца в df['C1'].

Вот функция, которую я написал:

def get_component(df):
    if ~df['C2'].isna():
        return df['C2']
    elif ~df['C3'].isna():
        return df['C3']
    elif ~df['C4'].isna():
        return df['C4']
    elif ~df['C5'].isna():
        return df['C5']
df['C1'] = df.apply(get_component, axis=1)

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

AttributeError: ("'float' object has no attribute 'isna'", 'occurred at index 0')

Любые идеи о том, как исправить эту ошибку, чтобы я мог достичь этой цели? Есть ли другой способ добиться того же результата?

Спасибо за помощь!

Ответы [ 2 ]

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

Решение, в котором используется метод pandas 'stack:

import pandas as pd
import numpy as np

# Initialize example dataframe
df = pd.DataFrame({
    "C2": [np.nan, 3, np.nan, np.nan, np.nan],
    "C3": [5, np.nan, np.nan, np.nan, np.nan],
    "C4": [np.nan, np.nan, np.nan, 7, 3],
    "C5": [np.nan, np.nan, 2, np.nan, np.nan],
})

df["C1"] = df.stack().to_numpy()
print(df)
# Output:
#     C2   C3   C4   C5   C1
# 0  NaN  5.0  NaN  NaN  5.0
# 1  3.0  NaN  NaN  NaN  3.0
# 2  NaN  NaN  NaN  2.0  2.0
# 3  NaN  NaN  7.0  NaN  7.0
# 4  NaN  NaN  3.0  NaN  3.0
0 голосов
/ 05 марта 2020

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

df['C1'] = np.where(~df['C2'].isna(),df['C2'],
                          np.where(~df['C3'].isna(),df['C3'],
                                  np.where(~df['C4'].isna(),df['C4'],
                                          np.where(~df['C5'].isna(),df['C5'],None))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...