Элегантный способ определить столбцы на основе регулярных выражений и заполнить различные значения по умолчанию - PullRequest
1 голос
/ 28 июня 2019

У меня есть фрейм данных, который может быть сгенерирован из кода ниже

df = pd.DataFrame({'person_id' :[1,2,3],'date1':['12/31/2007','11/25/2009',np.nan],
           'hero_id':[2,4,np.nan],'date2':['12/31/2017',np.nan,'10/06/2015'],
           'heroine_id':[1,np.nan,5],'date3':['12/31/2027','11/25/2029',np.nan],
           'bud_source_value':[1250000,250000,np.nan],
           'prod__source_value':[10000,20000,np.nan]})

Фрейм данных выглядит так, как показано ниже с Nan's

enter image description here

Что я хотел бы сделать, это

1) Заполнить na с 0 (ноль) для столбцов, заканчивающихся на «id» 2) Заполнить na «неизвестными» для столбцов, заканчивающихся на «value»3) Заполните "31.12.9999" для столбцов, начинающихся с "date"

Я попробовал описанный ниже подход, но он длинный и кажется, что он не элегантный

df2 = df.filter(regex='id$')
df2.fillna(0)

df2 = df.filter(regex='^date')
df2.fillna('12/31/9999')

df2 = df.filter(regex='value$')
df2.fillna('unknown')

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

Ответы [ 2 ]

3 голосов
/ 28 июня 2019

Вы можете использовать DataFrame.fillna со словарем как:

d = {col:value for col_s,value in zip(['id','value','date'], [0,'unknown','12/31/9999']) for col in df.filter(like=col_s)}

df = df.fillna(d)

print(df)
   person_id       date1  hero_id       date2  heroine_id       date3  \
0          1  12/31/2007      2.0  12/31/2017         1.0  12/31/2027   
1          2  11/25/2009      4.0  12/31/9999         0.0  11/25/2029   
2          3  12/31/9999      0.0  10/06/2015         5.0  12/31/9999   

  bud_source_value prod__source_value  
0         1.25e+06              10000  
1           250000              20000  
2          unknown            unknown  

print(d)
{'person_id': 0,
 'hero_id': 0,
 'heroine_id': 0,
 'bud_source_value': 'unknown',
 'prod__source_value': 'unknown',
 'date1': '12/31/9999',
 'date2': '12/31/9999',
 'date3': '12/31/9999'}
3 голосов
/ 28 июня 2019

Для множественного выбора в соответствии с несколькими условиями вы можете использовать np.select:

import numpy as np

# choices
c = df.columns.str
c1 = c.endswith('id')
c2 = c.endswith('value')
c3 = c.startswith('date')

out = np.select([c1,c2,c3], [df.fillna(0), df.fillna('unknown'), df.fillna("12/31/9999")])
pd.DataFrame(out, columns=df.columns)

    person_id   date1     hero_id  date2       heroine_id  date3  \
0         1  12/31/2007       2  12/31/2017          1  12/31/2027   
1         2  11/25/2009       4  12/31/9999          0  11/25/2029   
2         3  12/31/9999       0  10/06/2015          5  12/31/9999   

      bud_source_value prod__source_value  
0         1.25e+06              10000  
1           250000              20000  
2          unknown            unknown 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...