提问人:Hack-R 提问时间:11/7/2017 更新时间:11/7/2017 访问量:35
通过提取数字值并将其替换为连续的小整数,以编程方式重命名元素
Programmatically rename elements by extracting number values and substituting them with small, consecutive integers
问:
我有一个 Pandas,其中的标签当前要么是,要么是包含字母和数字的字符串。Series
None
我需要重新标记非 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
评论