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

标签 python python-3.x pandas

我有以下数据框:

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

要转换为字符串,请使用 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/

相关文章:

python - Pandas Dataframe Append 或 Set_Value

python - Pandas 删除索引为字符串的数据行

python - sympy:双摆方程组

python - 设置 Mlflow 后端 (SQLite) 和工件(Azure Blob 存储)存储

python - 如何在 dask 数据框中添加反射(reflect)日期值(来自列)是否是假期成员的列

python - 如何使用 Fabric 使其并行运行?

python - NLTK:conllstr2tree 无法正常工作(Python3)

python - 使用带有 `map` 的多个参数的函数

python - threading.timer 只打印 for 循环的最后一个值

Python - Pandas - 导入 Excel 文件,遍历每一行,添加新值,并添加到数据框