我的数据框形状为(600,000 * 33) 其中一列称为“名称”,具有2000多个唯一值。我已使用以下代码对列进行了排序:
got.groupby('name').size().sort_values(ascending=False)
下面是每个名称的示例以及数据框中的行数
Name Count
John 90000
Daenerys 50000
Cersei 45000
... ...
Hound 2000
Joffrey 1500
LittleF 1200
... ...
我希望能够浏览数据框,并用'Other'(在这种情况下为'Joffrey'和'LittleF')替换少于2000行的所有名称(<2000为计数)。
答案 0 :(得分:2)
我认为最好使用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
答案 1 :(得分:1)
使用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 :(得分:0)
您不需要使用排序序列来过滤数据。相反,您可以使用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