python - 熊猫数据框从元素频率大于1的列创建唯一ID
问题描述
我有以下数据框:
line# key amino0 pos0 amino1 pos1 amino2 pos2
0 14 A 13 M 2 K 14
1 12 A 13 M 2 A 1
2 1 A 1 M 2 P 3
3 2 P 3 P 4 B 6
4 1 A 1 M 2 P 35
5 12 A 31 A 32 M 41
6 1 M 24 P 23 A 22
7 12 A 31 A 32 M 42
8 4 J 5 P 4 B 6
9 3 B 6 I 7 P 4
10 8 B 6 H 10 I 7
我想用频率> 1的键的每次出现来更新列'键'。我的输出应该是这样的:
line# key amino0 pos0 amino1 pos1 amino2 pos2
0 14_1 A 13 M 2 K 14
1 12_1 A 13 M 2 A 1
2 1_1 A 1 M 2 P 3
3 2_1 P 3 P 4 B 6
4 1_2 A 1 M 2 P 35
5 12_2 A 31 A 32 M 41
6 1_3 M 24 P 23 A 22
7 12_3 A 31 A 32 M 42
8 4_1 J 5 P 4 B 6
9 3_1 B 6 I 7 P 4
10 8_1 B 6 H 10 I 7
对于“键”列中的每个元素,第一部分是键,第二部分是频率出现次数。例如。键 12 的频率为 3,因此,键 12 在三行中的三个出现将更新为 12_1、12_2、12_3。
以下代码仅给出频率 > 1 的键。
df = pd.read_csv("myfile.txt", sep='\t', names = ['key', 'amino0', 'pos0','amino1', 'pos1','amino2', 'pos2'])
vc = df.key.value_counts()
print(vc[vc > 2].index[0])
如何更新密钥?避免循环是可取的。
解决方案
如果使用key
列类型:string
radd
df['key'] += df.groupby('key').cumcount().add(1).astype(str).radd('_')
#alternative
#df['key'] += '_' + df.groupby('key').cumcount().add(1).astype(str)
如果必须首先转换整数:
df['key'] = df['key'].astype(str) + '_' + df.groupby('key').cumcount().add(1).astype(str)
print (df)
line# key amino0 pos0 amino1 pos1 amino2 pos2
0 0 14_1 A 13 M 2 K 14
1 1 12_1 A 13 M 2 A 1
2 2 1_1 A 1 M 2 P 3
3 3 2_1 P 3 P 4 B 6
4 4 1_2 A 1 M 2 P 35
5 5 12_2 A 31 A 32 M 41
6 6 1_3 M 24 P 23 A 22
7 7 12_3 A 31 A 32 M 42
8 8 4_1 J 5 P 4 B 6
9 9 3_1 B 6 I 7 P 4
10 10 8_1 B 6 H 10 I 7
详情:
首先GroupBy.cumcount
用于由 colum 定义的每个组的计数器key
:
print (df.groupby('key').cumcount())
0 0
1 0
2 0
3 0
4 1
5 1
6 2
7 2
8 0
9 0
10 0
dtype: int64
然后从 开始,就像:add
1
1
+ 1
print (df.groupby('key').cumcount().add(1))
0 1
1 1
2 1
3 1
4 2
5 2
6 3
7 3
8 1
9 1
10 1
dtype: int64
对于转换为字符串使用astype
,object
显然意味着string
:
print (df.groupby('key').cumcount().add(1).astype(str))
0 1
1 1
2 1
3 1
4 2
5 2
6 3
7 3
8 1
9 1
10 1
dtype: object
推荐阅读
- javascript - Mongodb mongoose - 如果字段不存在,如何将文档添加到数组中
- templates - 分片数量增加不支持 logstash 模板
- logging - .NET Core - 如何根据类别进行过滤?
- python - python 正则表达式中的重复模式
- python-3.x - 如何从给定的字符串中删除元音
- python - 从 Numpy Meshgrid 生成位置向量
- laravel - Laravel - “文件不存在或不可读”,但文件移动成功
- python - `, =` 运算符有什么作用?
- python - Python / Selenium - “chromedriver”可执行文件需要在 PATH 中
- angular - Angular:数据绑定到其中一种数据类型中存在的属性