Я думаю, что когда вы определяете String
, вы определяете объект. Поэтому вам нужно использовать .equals()
. Когда вы используете примитивные типы данных, вы используете ==
, но с String
(и любым объектом) вы должны использовать .equals()
.
Я думаю, что лучше использовать 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
Вам не нужно использовать отсортированную серию для фильтрации ваших данных. Вместо этого вы можете использовать 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
Использование 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
2
на2000
– jezrael 14 July 2018 в 08:48>
до<=
, поэтому вам нужноgot['Name'] = np.where(got['Name'].isin(s.index[s >= 2000]), got['Name'], 'Other')
, пожалуйста, проверьте отредактированный ответ. – jezrael 14 July 2018 в 14:53