pandas dataframe从元素频率大于1的列创建唯一的id

2024-09-30 22:14:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧:

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

我想用出现频率大于等于的键更新列“key”;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

对于“key”列中的每个元素,第一部分是key,第二部分是freq occurrence number。例如,键12的频率为3,因此,三行中出现的三个键12将更新为12_1、12_2、12_3

以下代码仅给出freq>;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])

如何更新密钥?最好避免循环


Tags: 数据key元素dfline频率freqvc
1条回答
网友
1楼 · 发布于 2024-09-30 22:14:19

如果key列的类型是string,请使用^{}

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

详细信息:

首先使用^{}作为列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

然后^{}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

要转换为字符串,请使用^{}^{} means obviously ^{}

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

相关问题 更多 >