首页 > 解决方案 > 熊猫数据框从元素频率大于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])

如何更新密钥?避免循环是可取的。

标签: pythonpython-3.xpandas

解决方案


如果使用key列类型:stringradd

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 11+ 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

对于转换为字符串使用astypeobject显然意味着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

推荐阅读