通过提取数字值并将其替换为连续的小整数,以编程方式重命名元素

Programmatically rename elements by extracting number values and substituting them with small, consecutive integers

提问人:Hack-R 提问时间:11/7/2017 更新时间:11/7/2017 访问量:35

问:

我有一个 Pandas,其中的标签当前要么是,要么是包含字母和数字的字符串。SeriesNone

我需要重新标记非 None 元素,以保持相同的分组和顺序,但将数字替换为每个组的最小连续数字,从 1 开始(请参阅下面的示例)。我还需要做简单的文本替换来替换字母(总是用“Group_”替换“G”)。

我想我可以编写一些极其低效且冗长的代码来做到这一点,但我有一种感觉,我的解决方案至少比任何像样的方法都长 100 行。所以我想知道一个好方法。

例:

import pandas as pd
mydat = pd.Series([None, 'G130', 'G151', 'G142', 'G151', 'G130', None])

结果数据系列:

>>> mydat
0    None
1    G130
2    G151
3    G142
4    G151
5    G130
6    None
dtype: object

期望的结果:

>>> mydat
0    None
1    Group_1
2    Group_3
3    Group_2
4    Group_3
5    Group_1
6    None
dtype: object
蟒蛇 熊猫

评论


答:

1赞 piRSquared 11/7/2017 #1
s = mydat.str[1:].dropna().astype(int)
g = 'Group_{}'.format
f = s.factorize(sort=True)[0] + 1

pd.Series([g(x) for x in f], s.index).combine_first(mydat)

0       None
1    Group_1
2    Group_3
3    Group_2
4    Group_3
5    Group_1
6       None
dtype: object
2赞 BENY 11/7/2017 #2
('Group_'+mydat.astype('category').cat.codes.add(1).astype(str)).mask(mydat.isnull())
Out[1168]: 
0        NaN
1    Group_1
2    Group_3
3    Group_2
4    Group_3
5    Group_1
6        NaN
dtype: object