如何获取dataframe列中列表之间的公共值?

2024-06-08 22:26:37 发布

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

因此,我有一个tsv文件,格式如下:

Gene   version   start           end
ADK    1         23,45,67,89     30,51,79,96
ADK    2         23,67,89        30,79,96
ADK    3         23,89           30,96

我想创建一个字典,只包含一个特定基因的所有3个版本中通用的开始和结束。词典应采用以下格式:

{'ADK':{'start':[23,89], 'end':[30.96]}

我目前正在尝试的代码是:

def get_strong_ranges(file):
    for entry in utils.records_iterator(file):
        if entry['gene'] not in gene_exons:
            gene_exons[entry['gene']] = {'start': list(),'end': list()}
        gene_exons[entry['gene']]['start'].append(entry['start'])
        gene_exons[entry['gene']]['end'].append(entry['end'])

然而,我还没有整理出常见的问题。关于如何做的任何建议


Tags: 文件intsvversion格式startlistfile
1条回答
网友
1楼 · 发布于 2024-06-08 22:26:37
df = pd.DataFrame({'gene': ['ADK', 'ADK', 'ADK'], 'version': [1,2,3], 'start': [[23,45,67,89], [23,67,89], [23,89]], 'end': [[30,51,79,96], [30,79,96], [30,96]]})

df
Out[14]: 
  gene  version             start               end
0  ADK        1  [23, 45, 67, 89]  [30, 51, 79, 96]
1  ADK        2      [23, 67, 89]      [30, 79, 96]
2  ADK        3          [23, 89]          [30, 96]

将“开始”列从列表转换为数字:

start_df = df.explode('start')
start_df 
Out[16]: 
  gene  version start               end
0  ADK        1    23  [30, 51, 79, 96]
0  ADK        1    45  [30, 51, 79, 96]
0  ADK        1    67  [30, 51, 79, 96]
0  ADK        1    89  [30, 51, 79, 96]
1  ADK        2    23      [30, 79, 96]
1  ADK        2    67      [30, 79, 96]
1  ADK        2    89      [30, 79, 96]
2  ADK        3    23          [30, 96]
2  ADK        3    89          [30, 96]

计算每个“开始”值的版本数:

start_df_counts = start_df.groupby(['gene', 'start'])['version'].count()
Out[19]: 
gene  start
ADK   23       3
      45       1
      67       2
      89       3
Name: version, dtype: int64

将其与唯一版本的数量进行比较:

start_df_counts == len(set(start_df['version']))
Out[20]: 
gene  start
ADK   23        True
      45       False
      67       False
      89        True
Name: version, dtype: bool

仅取以下值:

start_df_counts[start_df_counts == len(set(start_df['version']))]
Out[30]: 
gene  start
ADK   23       3
      89       3
Name: version, dtype: int64

现在,按基因分组并转换为列表:

start_df_common = start_df_counts[start_df_counts == len(set(start_df['version']))]
start_df_common = start_df_common.reset_index()
start_df_common.groupby('gene')['start'].apply(list)
Out[35]: 
gene
ADK    [23, 89]

最后,我们可以将其转换为dict:

final_start_dict = start_df_common.groupby('gene')['start'].apply(list).to_dict()
final_start_dict
Out[38]: {'ADK': [23, 89]}

现在,您可以对结束列应用相同的设置

希望有帮助:)

相关问题 更多 >