Замените значения в столбце панд значением по умолчанию для отсутствующих ключей - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть несколько простых функций, которые необходимо реализовать в каждой строке определенных столбцов моего информационного кадра.Фрейм данных очень похож, 10 миллионов + строк.Мой фрейм данных выглядит примерно так:

Date      location   city        number  value
12/3/2018   NY       New York      2      500
12/1/2018   MN       Minneapolis   3      600
12/2/2018   NY       Rochester     1      800
12/3/2018   WA       Seattle       2      400

У меня есть такие функции:

def normalized_location(row):
    if row['city'] == " Minneapolis":
        return "FCM"
    elif row['city'] == "Seattle":
        return "FCS"
    else:
        return "Other"

, а затем я использую:

df['Normalized Location'] =df.apply (lambda row: normalized_location (row),axis=1)

Это очень медленно,Как я могу сделать это более эффективным?

Ответы [ 4 ]

0 голосов
/ 04 декабря 2018

Мы можем сделать это BLAZING быстрым, используя map с defaultdict.

from collections import defaultdict

d = defaultdict(lambda: 'Other')
d.update({"Minneapolis": "FCM", "Seattle": "FCS"})

df['normalized_location'] = df['city'].map(d)

print(df)
        Date location         city  number  value normalized_location
0  12/3/2018       NY     New York       2    500               Other
1  12/1/2018       MN  Minneapolis       3    600                 FCM
2  12/2/2018       NY    Rochester       1    800               Other
3  12/3/2018       WA      Seattle       2    400                 FCS

... для обхода вызова fillna по соображениям производительности.Этот подход довольно легко обобщает множественные замены.

0 голосов
/ 04 декабря 2018

Возможно, вы захотите использовать np.select:

conds = [df.city == 'Minneapolis', df.city == 'Seattle']
choices = ['FCM', 'FCS']

df['normalized_location'] = np.select(conds, choices, default='other')

>>> df
        Date location         city  number  value normalized_location
0  12/3/2018       NY     New York       2    500               other
1  12/1/2018       MN  Minneapolis       3    600                 FCM
2  12/2/2018       NY    Rochester       1    800               other
3  12/3/2018       WA      Seattle       2    400                 FCS
0 голосов
/ 04 декабря 2018

Попробуйте вместо этого:

map_ = {'Minneapolis':'FCM', 'Seattle':'FCS'}
df.loc[:,'city'] = df.loc[:,'city'].map(map_).fillna('Other')

print(df)
    Date      location  city    number  value
0  12/3/2018       NY  Other       2    500
1  12/1/2018       MN    FCM       3    600
2  12/2/2018       NY  Other       1    800
3  12/3/2018       WA    FCS       2    400
0 голосов
/ 04 декабря 2018

Вы можете использовать вложенные np.where():

df['city'] = np.where(df['city']=='Minneapolis', 'FCM', np.where(df['city']=='Seattle', 'FCS', 'Other'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...