gpt4 book ai didi

python - 在 Pandas 中按值计数重新分配字符串

转载 作者:行者123 更新时间:2023-11-28 21:55:42 28 4
gpt4 key购买 nike

我希望在 scikitlearn 分类模型上使用的 pandas 数据框中有许多基于字符串的列。我知道我必须使用 oneHotEncoder 来正确编码变量,但首先,我想减少列中的变化,取出列中出现次数少于 x% 的字符串, 或者不在列中按计数排名前 x 的字符串中。

这是一个例子:

df1 = pd.DataFrame({'a':range(22), 'b':list('aaaaaaaabbbbbbbcccdefg'), 'c':range(22)})
df1
a b c
0 0 a 0
1 1 a 1
2 2 a 2
3 3 a 3
4 4 a 4
5 5 a 5
6 6 a 6
7 7 a 7
8 8 b 8
9 9 b 9
10 10 b 10
11 11 b 11
12 12 b 12
13 13 b 13
14 14 b 14
15 15 c 15
16 16 c 16
17 17 c 17
18 18 d 18
19 19 e 19
20 20 f 20
21 21 g 21

如您所见,a、b 和 c 出现在 b 列的概率超过 10%,因此我想保留它们。另一方面,d、e、f 和 g 出现不到 10%(实际上大约有 5% 的时间),所以我想通过将它们更改为“其他”来解决这些问题:

df1['b']
0 a
1 a
2 a
3 a
4 a
5 a
6 a
7 a
8 b
9 b
10 b
11 b
12 b
13 b
14 b
15 c
16 c
17 c
18 other
19 other
20 other
21 other

我同样希望能够说我只想保留出现在前 2 位的值的频率,因此 b 列看起来像这样:

df1['b']
0 a
1 a
2 a
3 a
4 a
5 a
6 a
7 a
8 b
9 b
10 b
11 b
12 b
13 b
14 b
15 other
16 other
17 other
18 other
19 other
20 other
21 other

我没有看到在 Pandas 中执行此操作的明显方法,尽管我承认在 R 中对此了解得更多。有什么想法吗?关于如何使 Nones 具有鲁棒性的任何想法,Nones 可能出现超过 10% 的时间或位于值的前 x 个数中?

最佳答案

这有点扭曲,但这是一个复杂的问题。

首先,获取计数:

In [24]: sizes = df1["b"].value_counts()

In [25]: sizes
Out[25]:
b
a 8
b 7
c 3
d 1
e 1
f 1
g 1
dtype: int64

现在,选择您不喜欢的指数:

In [27]: bad = sizes.index[sizes < df1.shape[0]*0.1]

In [28]: bad
Out[28]: Index([u'd', u'e', u'f', u'g'], dtype='object')

最后,将“其他”分配给那些包含错误索引的行:

In [34]: df1.loc[df1["b"].isin(bad), "b"] = "other"

In [36]: df1
Out[36]:
a b c
0 0 a 0
1 1 a 1
2 2 a 2
3 3 a 3
4 4 a 4
5 5 a 5
6 6 a 6
7 7 a 7
8 8 b 8
9 9 b 9
10 10 b 10
11 11 b 11
12 12 b 12
13 13 b 13
14 14 b 14
15 15 c 15
16 16 c 16
17 17 c 17
18 18 other 18
19 19 other 19
20 20 other 20
21 21 other 21

[22 rows x 3 columns]

您可以使用 sizes.sort() 并从结果中获取最后的 n 值,以便仅找到前两个索引。

编辑:您应该可以这样做,将所有“b”实例替换为 filterByColumn:

def filterDataFrame(df1, filterByColumn):
sizes = df1[filterByColumn].value_counts()
...

关于python - 在 Pandas 中按值计数重新分配字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22539943/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com