Pandas: Заменить значения в столбце «Другое» на основе количества строк, соответствующих значению

Я думаю, что когда вы определяете String, вы определяете объект. Поэтому вам нужно использовать .equals(). Когда вы используете примитивные типы данных, вы используете ==, но с String (и любым объектом) вы должны использовать .equals().

3
задан praveen 13 July 2018 в 11:09
поделиться

3 ответа

Я думаю, что лучше использовать Series.value_counts с фильтрацией:

s = got['Name'].value_counts()
got['Name'] = np.where(got['Name'].isin(s.index[s >= 2000]), got['Name'], 'Other')

Или:

got['Name'] = np.where(got['Name'].isin(s.index[s < 2000]), 'Other', got['Name'])

Образец:

df = pd.DataFrame({'Name': ['John', 'Daenerys', 'Cersei', 'Hound', 'Joffrey', 'LittleF'], 
                   'Count': [90000, 50000, 45000, 2000, 1500, 1200]})
got = pd.DataFrame({'Name':np.repeat(df['Name'].values, df['Count'])})

#check sizes
print (got.groupby('Name').size().sort_values(ascending=False))
Name
John        90000
Daenerys    50000
Cersei      45000
Hound        2000
Joffrey      1500
LittleF      1200
dtype: int64

s = got['Name'].value_counts()
got['Name'] = np.where(got['Name'].isin(s.index[s >= 2000]), got['Name'], 'Other')

#check sizes
print (got.groupby('Name').size().sort_values(ascending=False))
Name
John        90000
Daenerys    50000
Cersei      45000
Other        2700
Hound        2000
dtype: int64
3
ответ дан jezrael 17 August 2018 в 13:05
поделиться
  • 1
    {got ['Name'] = np.where (получил ['Name']. isin (s.index [s & lt; 2]), 'Other', получил ['Name'])} это заменяет первые 2k имена с другими rathen, чем count. – praveen 14 July 2018 в 08:46
  • 2
    @praveen - да, только изменить 2 на 2000 – jezrael 14 July 2018 в 08:48
  • 3
    я действительно использовал 2000, а не 2. Но похоже, что вместо первых значений 2000 вместо – praveen 14 July 2018 в 12:50
  • 4
    @praveen - Вы правы, необходимо использовать изменение > до <=, поэтому вам нужно got['Name'] = np.where(got['Name'].isin(s.index[s >= 2000]), got['Name'], 'Other'), пожалуйста, проверьте отредактированный ответ. – jezrael 14 July 2018 в 14:53
  • 5
    Спасибо! после перехода на & gt; = решение работало для меня! Ценю вашу помощь!!! – praveen 16 July 2018 в 14:32

Вам не нужно использовать отсортированную серию для фильтрации ваших данных. Вместо этого вы можете использовать groupby + transform для эффективного создания серии, содержащей вашу группу по строкам.

g = got.groupby('name')['name'].transform('size')

Затем обновите серию условно:

got.loc[g < 2000, 'name'] = 'Other'

Пример использования

df = pd.DataFrame({'name': ['A', 'A', 'B', 'C', 'B']})

g = df.groupby('name')['name'].transform('size')
df.loc[g > 1, 'name'] = 'Other'

print(df)

    name
0  Other
1  Other
2  Other
3      C
4  Other
1
ответ дан jpp 17 August 2018 в 13:05
поделиться
  • 1
    Я получаю следующую ошибку: TypeError: функция преобразования недопустима для типов данных – praveen 14 July 2018 в 09:00
  • 2
    @praveen, см. обновление. – jpp 14 July 2018 в 09:56

Использование df.loc

Пример:

import pandas as pd

df = pd.DataFrame({"Name":["John", "Daenerys", "Cersei", "Hound", "Joffrey", "LittleF"],"Count": [90000, 50000, 45000, 2000, 1500, 1200]})
df.loc[df["Count"] < 2000, 'Name'] = "Other"
print(df)

Выход:

   Count      Name
0  90000      John
1  50000  Daenerys
2  45000    Cersei
3   2000     Hound
4   1500     Other
5   1200     Other
1
ответ дан Rakesh 17 August 2018 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: