2016-10-27 6 views
2

У меня есть кадр данных ДФ:Обрабатывать пропущенные значения, основанные на другом столбце значения

df = pd.DataFrame({'City': ['Cambridge','','Boston','Washignton','','Tampa', 
'Danvers','Miami','Cambridge','Miami','','Washington'], 'State': ['MA','DC','MA', 
'DC','MA','FL','MA','FL','MA','FL','FL','DC']}) 

Как мы можем видеть в приведенном выше ФР, у меня есть два столбца «Город» и «государство». Есть 3 города с '' (Нет значений). Я хочу присвоить значение отсутствующим значениям в городах. Назначение должно выполняться следующим образом. Город, который существует максимальное количество раз для определенного состояния, должен быть присвоен отсутствующему значению для этого конкретного состояния. Например: второй недостающий город соответствует состоянию MA. Теперь, если внимательно изучить данные, «Кембридж» - это город, который встречается чаще всего для государственной МА. Поэтому это недостающее значение следует заменить на «Cambridge».

Следуя той же тенденции, первый пропавший город должен быть Вашингтоном, вторым должен быть Кембридж, а третьим должен быть Майами.

Как выполнить эту задачу с помощью панд?

ответ

0
top_cities = {} 
for state in np.unique(df.State): 
    cities = [city for city in df[df.State==state].City.values if city] 
    top_cities[state] = max(set(cities), key=cities.count) 

new_cities = [] 
for city, state in df.values: 
    if city: 
     new_cities.append(city) 
    else: 
     new_cities.append(top_cities[state]) 

df['City'] = new_cities 

enter image description here

+0

ValueError: слишком много значений для распаковки – ComplexData

+0

Работает отлично для меня с версией python 3.5 и pandas 0.19.0 – AlexG

3

IIUC

df.update(df.replace('', np.nan).set_index('State', append=True) \ 
    .groupby(level='State').City \ 
    .apply(lambda x: x.fillna(x.value_counts().idxmax())) \ 
    .reset_index('State', drop=True)) 
df 

enter image description here


код ссылки
примечание: дополнительный столбец A оригинальна City колонна делает его электронной Asier, чтобы увидеть, где города заполняются в.

df = pd.DataFrame({ 
     'City': ['Cambridge','','Boston','Washignton','','Tampa', 
       'Danvers','Miami','Cambridge','Miami','','Washington'], 
     'State': ['MA','DC','MA','DC','MA','FL', 
        'MA','FL','MA','FL','FL','DC'], 
     'A': ['Cambridge','','Boston','Washignton','','Tampa', 
       'Danvers','Miami','Cambridge','Miami','','Washington']}) 

df.update(df.replace('', np.nan).set_index('State', append=True) \ 
    .groupby(level='State').City \ 
    .apply(lambda x: x.fillna(x.value_counts().idxmax())) \ 
    .reset_index('State', drop=True)) 
df 

enter image description here

+0

кусок кода, предоставленного вами работает, и отображает тот же результат для меня. Но когда я печатаю все столбцы df, изменения там не производятся. В чем может быть проблема? – ComplexData

+0

вам нужно назначить то, что я сделал, на 'df'. Я обновлю свой пост. – piRSquared

+0

Хорошо, что часть работала. Но у меня также есть другие столбцы. Если я запускаю над куском кода, он заменяет весь мой df чуть более двух столбцов. Я хочу, чтобы другие столбцы были одинаковыми – ComplexData

Смежные вопросы