【问题标题】:Iterate over dataframes, write a dictionary and append float values to keys遍历数据帧,编写字典并将浮点值附加到键
【发布时间】:2020-10-22 16:08:11
【问题描述】:

我有超过 6k 个看起来像这样的数据帧,gene_id 在所有文件中保持不变,但不是 copy_number:

gene_id             copy_number

ENSG00000223972.5   NaN
ENSG00000227232.5   NaN
ENSG00000278267.1   NaN
ENSG00000243485.3   NaN
ENSG00000274890.1   NaN
ENSG00000237613.2   NaN
ENSG00000268020.3   NaN
ENSG00000240361.1   1.0
ENSG00000186092.4   1.0
ENSG00000238009.5   1.0

我的想法是遍历所有文件,从第一个文件创建一个字典,并在遍历其他文件时附加对应于gene_id的副本号:

{'ENSG00000223972.5': nan,
 'ENSG00000227232.5': nan,
 'ENSG00000278267.1': nan,
 'ENSG00000243485.3': nan,
 'ENSG00000274890.1': nan,
 'ENSG00000237613.2': nan,
 'ENSG00000268020.3': nan,
 'ENSG00000240361.1': 1.0,
 'ENSG00000186092.4': 1.0,
 'ENSG00000238009.5': 1.0}

第二个文件:

gene_id             copy_number

ENSG00000223972.5   3.0
ENSG00000227232.5   3.0
ENSG00000278267.1   3.0
ENSG00000243485.3   2.0
ENSG00000274890.1   2.0
ENSG00000237613.2   2.0
ENSG00000268020.3   2.0
ENSG00000240361.1   1.0
ENSG00000186092.4   1.0
ENSG00000238009.5   1.0

最终结果思路:

    {'ENSG00000223972.5': nan, 3.0,
     'ENSG00000227232.5': nan, 3.0,
     'ENSG00000278267.1': nan, 3.0,
     'ENSG00000243485.3': nan, 2.0,
     'ENSG00000274890.1': nan, 2.0,
     'ENSG00000237613.2': nan, 2.0,
     'ENSG00000268020.3': nan, 2.0,
     'ENSG00000240361.1': 1.0, 1.0,
     'ENSG00000186092.4': 1.0, 1.0,
     'ENSG00000238009.5': 1.0, 1.0}

我的代码:

df1 = pd.read_csv('/Users/file1.tsv', sep = '\t')
dict1 = df1.to_dict()
   
#Iterate through all the files in folder:
 
genelevelpath = '/Users/user/myfiles/'
allfiles      = glob.glob(genelevelpath + '/*.tsv')
   for filename in allfiles:
      pd.read(file)

我需要帮助将浮点数从副本号附加到字典并检查键是否对应。

谢谢!

【问题讨论】:

  • 嗨,艾丽西亚。是否需要从df 转到dict

标签: python pandas dictionary


【解决方案1】:
import pandas as pd
from glob import glob

genelevelpath = '/Users/user/myfiles/'

all_files = glob.glob(genelevelpath + '/*.tsv')

df = pd.concat((pd.read_csv(f, sep='\t') for f in all_files))

df.groupby('gene_id')['copy_number'].apply(list)

【讨论】:

  • 这正是我想要的,但还有更多。超过 6k 个文件总共占用 6GB 空间,所以我认为 pandas 无法处理。这不是一种更 Pythonic 的方式吗?
  • 如果你的系统内存足够存储内存中的所有数据帧,我认为这不是问题。
【解决方案2】:

首先第一个dict中的值应该是列表(to_dict应该自动这样做)

{'ENSG00000223972.5': [nan],
 'ENSG00000227232.5': [nan],
 'ENSG00000278267.1': [nan],
 'ENSG00000243485.3': [nan],
 'ENSG00000274890.1': [nan],
 'ENSG00000237613.2': [nan],
 'ENSG00000268020.3': [nan],
 'ENSG00000240361.1': [1.0],
 'ENSG00000186092.4': [1.0],
 'ENSG00000238009.5': [1.0]}

然后像这样尝试:

for x,y in zip(list(firstDict.keys()),list(secondDict.keys())):
  firstDict[x].append(secondDict[y])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多