【问题标题】:pandas dataframe create unique ids from column having elements frequency greater than 1熊猫数据框从元素频率大于1的列创建唯一ID
【发布时间】:2018-08-02 16:07:11
【问题描述】:

我有以下数据框:

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

对于 'key' 列中的每个元素,第 1 部分是键,第 2 部分是频率出现次数。例如。键 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])

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

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

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

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

    【讨论】:

    • 你能解释一下 .cumcount().add(1).astype(str) 是如何工作的吗?
    猜你喜欢
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2013-05-09
    • 2021-01-25
    • 1970-01-01
    • 2021-08-12
    • 2023-01-28
    相关资源
    最近更新 更多