Манипулирование данными - получение данных из другого столбца, если `nan` - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть Pandas DataFrame из 23 столбцов и 1119 строк.

Вот проблема, столбцы 13, 14, 20 и 21 имеют тип float d.

Если данные в столбец 13 и 14 равен nan, тогда они присутствуют в 20 и 21, и наоборот.

Я хочу создать столбец, если значение отсутствует, получить от другого.

Пример: столбцы 13 и 14 имеют значение nan, затем получают значения из 20 и 21.

Вот то, что я придумал, я создал функцию и повторил, используя itertuples

def AP_calc(df):
    for i in df.itertuples():
        if i[20]==np.nan & i[21]==np.nan:
           pool = i[13] + i[14]
        else:
            pool = i[20] + i[21]
        return pool

затем использовал функцию apply, но это не работает.

df["test"] = df[['AP in %','AP_M in %','FixP in €','FixP C in €']].apply(AP_calc,axis=1)

Я пробовал и другие методы, но не работает, пожалуйста, помогите мне, пожалуйста

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Использование numpy.where с маской, созданной Series.isna:

m = df['FixP in €'].isna() & df['FixP C in €'].isna()
df["test"] = np.where(m, df['AP in %'] + df['AP_M in %'], df['FixP in €'] + df['FixP C in €'])

Или:

c1 = ['FixP in €','FixP C in €']
c2 = ['AP in %','AP_M in %']

m = df[c2].isna().all(axis=1)
df["test"] = np.where(m, df[c1].sum(axis=1), df[c2].sum(axis=1))

Альтернатива с выбором по позициям с DataFrame.iloc:

c1 = [20,21]
c2 = [13,14]

m = df.iloc[:, c2].isna().all(axis=1)
df["test"] = np.where(m, df.iloc[:, c1].sum(axis=1), df.iloc[:, c2].sum(axis=1))
0 голосов
/ 21 февраля 2020

Просто позвольте столбцам заполнить N / A места друг друга:

import pandas as pd
import numpy as np
df = pd.DataFrame({'Bob': [10, 30, np.nan], 
                   'Alice': [13, np.nan, 40]})

df['Bob'].fillna(df['Alice'], inplace=True)
df['Alice'].fillna(df['Bob'], inplace=True)
...