Панды на Python Команда If-then - PullRequest
0 голосов
/ 14 мая 2018

У меня есть следующий код

GU_ES3['Qnd'] = GU_ES3['Qnd,hw_m2'] * GU_ES3['UPOR']

Я обнаружил, что некоторые значения в GU_ES3['UPOR'] пустые. И в этом сценарии я хотел бы вызвать другой столбец, например, GU_ES3['NPOR'], но только в этом случае, когда значения в столбце GU_ES3['UPOR'] равны 0 или NaN.

Вы можете мне помочь?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Попробуйте использовать pd.Series.where:

GU_ES3['Qnd'] = GU_ES3['Qnd,hw_m2'] * GU_ES3['UPOR'].where(~GU_ES3['UPOR'].isnull() & (GU_ES3['UPOR'] != 0), other=GU_ES3['NPOR'])
0 голосов
/ 14 мая 2018

Вы хотите

  1. значения из одного DataFrame заменяются другим при определенной ситуации
  2. убедитесь, что 0 или NaN обрабатываются одинаково

Для (2) вы можете заменить 0 на NaN, а для (1) вы можете использовать pd.Series.fillna для заполнения NaN в UPOR с помощью NPOR, но только там, где это NaN.

i = GU_ES3['Qnd,hw_m2']
j = GU_ES3['UPOR'].replace(0, np.nan).fillna(GU_ES3['NPOR'])
GU_ES3['Qnd'] = i * j 

В качестве альтернативы вы можете использовать np.where для выполнения замены:

GU_ES3['Qnd'] = GU_ES3['Qnd,hw_m2'] * np.where(
    GU_ES3['UPOR'].replace({0 : np.nan}).isna(), GU_ES3['NPOR'], GU_ES3['UPOR']
)

Обратите внимание, что при замене, если, например, вы также хотите заменить 1, 2 или 3, вам просто нужно будет использовать .replace(dict.fromkeys([1, 2, 3], np.nan)) в своем коде.

...