熊猫:根据对应于该值的行数,将列中的值替换为“其他”

时间:2018-07-13 11:09:37

标签: python python-3.x pandas

我的数据框形状为(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为计数)。

3 个答案:

答案 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