如何更改只出现一次的值?(Pandas)

cyvaqqii  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(91)

假设我有一个这样的样本 Dataframe ,瓦尔是一个二进制值(在这个例子中介于1和2之间),我想消除val中的异常值,将它们更改为与多数值相同。

df = pandas.DataFrame({'name':['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C'], 'val':[1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2]})

   name  val
0     A    1
1     A    2
2     A    2
3     A    2
4     B    2
5     B    1
6     B    1
7     B    1
8     C    1
9     C    1
10    C    2
11    C    2

我希望将索引0和4处的值更正(此处分别更正为2和1),因为每组中只有一个事件,但C不变。
我想我可以写一个transform语句,但不知道如何去做。

kzmpq1sx

kzmpq1sx1#

正如您所写的,您只有两个可能的值,您可以比较每个值的计数:

def fix_outliers(sr):
    cnt = sr.value_counts()
    return sr if cnt.iloc[0] == cnt.iloc[1] else [cnt.index[0]]*len(sr)

out = df.groupby('name')['val'].transform(fix_outliers)

输出:

>>> out
0     2
1     2
2     2
3     2
4     1
5     1
6     1
7     1
8     1
9     1
10    2
11    2
Name: val, dtype: int64
vngu2lb8

vngu2lb82#

如果您想保留出现次数最多的值,可以使用mode查找这些值,然后检查modecount是否等于1。如果不等于1,则意味着有两个或更多值以相同频率出现。

for name in df["name"].unique(): #find distinct names in df
    if(df[(df["name"] == name)].mode()["val"].count() == 1): #check if mode is sized 1
        most_common_value = df[(df["name"] == name)].mode()["val"][0] # find the mode
        df.loc[df["name"] == name , "val"] = most_common_value # modify df to val be the mode

输出:

name val
0   A   2
1   A   2
2   A   2
3   A   2
4   B   1
5   B   1
6   B   1
7   B   1
8   C   1
9   C   1
10  C   2
11  C   2

相关问题