【问题标题】:Move rows to new column if duplicate如果重复,将行移动到新列
【发布时间】:2016-01-15 03:17:40
【问题描述】:

What I'm trying to do

Sample_ID | fungi | fungi_ID | evalue | ITS_region
   A1       red      1112       0.7         1
   A1       red      1112       0.4         2
   B1       green    1234       0.03        1
   B1       blue     9090       0.02        2

到这里:

Sample_ID | fungi | fungi_ID | evalue | ITS_region | dup_ITS | dup_fungi | dup_fungi_ID
   A1       red      1112       0.7         1              2       red           1112      
   B1       green    1234       0.03        1              2       blue          9090

我已将来自 NCBI 爆炸的数据解析为 pandas 数据框。但是,所有数据都有重复的 ID(见附件),我需要来自同一行的两个 IDS 的信息。

我想要实现的是将行数据从重复项移动到与原始行相同的新列中。

df 包含以下标头(见附件):sample_idfungifungi_idevalueITS region

【问题讨论】:

  • 请提供示例代码,以便我们轻松重现您的问题。
  • 到目前为止您尝试过什么?要求工作代码而不付出努力的问题通常不会受到欢迎。
  • 每个Sample_ID是否只有两行?
  • 欢迎来到 Stack Overflow。您可以查看tour

标签: python pandas dataframe


【解决方案1】:

如果每个 Sample_ID 只有两行,请使用 joingroupby 按列 Sample_ID 并通过 last 获取最后一个值。然后drop删除重复的新列,reset_index重置索引:

print df

#  Sample_ID  fungi  fungi_ID  evalue  ITS_region
#0        A1    red      1112    0.70           1
#1        A1    red      1112    0.40           2
#2        B1  green      1234    0.03           1
#3        B1   blue      9090    0.02           2

print df.join(df.groupby('Sample_ID').last(), on='Sample_ID', rsuffix='_dup')
        .drop_duplicates(subset=['fungi_dup','fungi_ID_dup','ITS_region_dup','evalue_dup'])
        .reset_index(drop=True)

#  Sample_ID  fungi  fungi_ID  evalue  ITS_region fungi_dup  fungi_ID_dup  \
#0        A1    red      1112    0.70           1       red          1112   
#1        B1  green      1234    0.03           1      blue          9090   
#
#   evalue_dup  ITS_region_dup  
#0        0.40               2  
#1        0.02               2  

【讨论】:

    猜你喜欢
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多