我有以下数据框:
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 的键的每次出现更新列“key”。我的输出应该是这样的:
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
对于“键”列中的每个元素,第 1 部分是键,第 2 部分是出现频率。例如。键 12 的频率为 3,因此,在三行中出现三次键 12 将更新为 12_1、12_2、12_3。
以下代码仅提供频率 >1 的 key 。
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 ?最好避免循环。
最佳答案
如果 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
对于由列 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
means obviously 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
关于python - pandas dataframe 从元素频率大于 1 的列创建唯一 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51657999/