以编程方式重命名元素,方法是提取数字值并用小的连续整数代替它们

时间:2017-11-06 18:23:56

标签: python pandas

我有一个Pandas Series,其中标签当前为None或包含字母和数字的字符串。

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

我想我可以编写一些非常低效且冗长的代码来做这件事,但我觉得我的解决方案至少要比任何体面的方法长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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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