【问题标题】:Convert an iteration over dictionaries into a pandas dataframe将字典上的迭代转换为 pandas 数据框
【发布时间】:2016-04-22 06:11:17
【问题描述】:

我使用条件语句(未显示)从 2 个输入文件生成了 2 个字典。然后我打算使用这两个字典来识别重叠的值。然后我想直接将迭代的输出用作熊猫数据框。为此,我首先将迭代/for 循环输出到文件 (Output.xls) 中,然后将该文件作为 pandas 数据帧读取。虽然这很好用,但我想知道是否有一种方法可以直接使用下面迭代中的“换行符”作为空熊猫数据框的输入。除了 dataFrame.from_dict 之外,我在 Python 上找不到执行此操作的选项。但是,这需要 1 部字典,但我有多个要连接在一起的字典,以及我正在使用的其他变量。

exp1_dict.items() 是: [('lnc3', ['SPATA1', 'AHNAK', 'FGG', 'ERAP1', 'HZ', 'SAASDAS', 'NLRC5', 'HUWE1']), ('lnc2', ['SPATA1' , 'FGG', 'TMEM68', 'ATP6AP', 'HUWE1']), ('lnc1', ['SPATA1', 'AHNAK', 'FGG', 'TMEM68', 'ERAP1', 'ATP6AP', ' SAASDAS'、'RAD17'、'HUWE1'])] exp2_dict.items() 是: [('lnc3', ['SPATA1', 'AHNAK', 'TMEM68', 'ERAP1', 'HZ', 'RAD17', 'NLRC5', 'HUWE1']), ('lnc2', ['SPATA1' , 'FGG', 'ERAP1', 'HZ']), ('lnc1', ['SPATA1', 'AHNAK', 'FGG', 'TMEM68', 'ERAP1', 'HZ', 'ATP6AP', ' RAD17']), ('lnc4', ['ERAP1', 'PRSS16', 'HZ', 'NLRC5'])]

遍历字典并生成“换行符”的代码是:

out = open("Output.xls", "w") #generates an empty output file
out.write('Header1\tHeader2\tHeader3\tHeader4\tHeader5\tHeader6\tHeader7\tHeader8\tHeader9\tHeader10\tHeader11\n')#Adds header to output file

intersection_dict={} #empty intersection header
for key, value1 in exp1_dict.items(): #reiterates over the 2 dictionaries
        if key in exp2_dict.keys():
                intersection_dict[key]=list(set(value1).intersection(exp2_dict[key]))
                newline=key, str(f_exp1_dict[key]), str(f_exp2_dict[key]), str('|'.join(value1)), str(len(exp1_dict[key])), str(len(exp1_corr.index)), str('|'.join(exp2_dict[key])), str(len(exp2_dict[key])), str(len(exp2_corr.index)), str('|'.join(intersection_dict[key])), str(len(intersection_dict[key]))
                out.write('\t'.join(newline)+'\n')  

然后我使用 pandas 数据框读取 Output.xls 文件:

out.close()
new_input=pd.read)table("Output.xls", index_col=0)

我想知道是否有办法将上面的“换行符”直接写入带有上面标题的空熊猫数据帧,而不是创建一个输出文件然后将其作为熊猫数据框输入。

Output.xls 文件如下所示:

标题 1 标题 2 标题 3 标题 4 标题 5 标题 6 标题 7 标题 8 标题 9 标题 10 标题 11 lnc3 4 4 SPATA1|AHNAK|FGG|ERAP1|HZ|SAASDAS|NLRC5|HUWE1 8 12 SPATA1|AHNAK|TMEM68|ERAP1|HZ|RAD17|NLRC5|HUWE1 8 12 HZ|ERAP1|AHNAK|HUWE1|NLRC5|SPATA1 6 lnc2 2 3 SPATA1|FGG|TMEM68|ATP6AP|HUWE1 5 12 SPATA1|FGG|ERAP1|HZ 4 12 SPATA1|FGG 2 lnc1 1.5 2 SPATA1|AHNAK|FGG|TMEM68|ERAP1|ATP6AP|SAASDAS|RAD17|HUWE1 9 12 SPATA1|AHNAK|FGG|TMEM68|ERAP1|HZ|ATP6AP|RAD17 8 12 ERAP1|RAD17|AHNAK|TMEM68|ATP6AP|SPATA1 |FGG 7

【问题讨论】:

  • 几乎可以肯定,有一种简单的方法可以做到这一点。但是,我很不清楚输入的样子。如果问题得到简化,我会更容易提供帮助。
  • @piRSquared thx 发表评论。我已经添加了上面的字典。我希望这会有所帮助。
  • 我假设这是 Python 3?另外,f_exp1_dictf_exp2_dict 是什么?
  • @Alexander 它是 Python 2.7.10 |Anaconda 2.4.0 (x86_64)| (默认,2015 年 10 月 19 日,18:31:17).f_exp1_dict1 和 f_exp2_dict2 是其他字典,每个对应的键都有一个值
  • 您能否为他们提供相关的键/值对,以便我们运行您的代码?还有exp1_corr/exp2_corr

标签: python dictionary pandas dataframe


【解决方案1】:

创建一个列表列表,然后用于创建数据框:

df = []
for key, value1 in exp1_dict.iteritems(): 
    if key in exp2_dict:
        dict_union = list(set(value1).intersection(exp2_dict[key]))
        col1 = key
        col2 = str(f_exp1_dict[key])
        col2 = str(f_exp2_dict[key])
        col3 = str('|'.join(value1))
        col4 = str(len(exp1_dict[key]))
        col5 = str(len(exp1_corr.index))
        col6 = str('|'.join(exp2_dict[key]))
        col7 = str(len(exp2_dict[key]))
        col8 = str(len(exp2_corr.index))
        col9 = str('|'.join(dict_union))
        col10 = str(dict_union)
        df.append([col1, col2, col3, col4, col5, col6, col7, col8, col9, col10])

df = pd.DataFrame(df)

【讨论】:

  • 感谢工作,为我使用的数据框添加列名:df.columns=['Header1', 'Header2'......'Header10']
【解决方案2】:

像 Alexander 提出的 f_exp1_dict 那样找出所有缺失的部分既费时又令人沮丧。但是您可能会发现下面的代码很有用。您必须进行修改以包含您拥有的所有其他字符串。

exp1_df = pd.DataFrame([[k, v] for k, v in exp1_dict.items()], columns=['Header1', 'Header4']).set_index('Header1')
exp2_df = pd.DataFrame([[k, v] for k, v in exp2_dict.items()], columns=['Header1', 'Header7']).set_index('Header1')

newlines = pd.concat([exp1_df, exp2_df], axis=1).dropna(subset=['Header4'])

exp1_df 看起来像

                                                   Header4
Header1                                                   
lnc3     [SPATA1, AHNAK, FGG, ERAP1, HZ, SAASDAS, NLRC5...
lnc2                  [SPATA1, FGG, TMEM68, ATP6AP, HUWE1]
lnc1     [SPATA1, AHNAK, FGG, TMEM68, ERAP1, ATP6AP, SA...

exp2_df 看起来像

                                                   Header7
Header1                                                   
lnc3     [SPATA1, AHNAK, TMEM68, ERAP1, HZ, RAD17, NLRC...
lnc2                              [SPATA1, FGG, ERAP1, HZ]
lnc1     [SPATA1, AHNAK, FGG, TMEM68, ERAP1, HZ, ATP6AP...
lnc4                            [ERAP1, PRSS16, HZ, NLRC5]

换行符看起来像

                                                Header4  \
lnc1  [SPATA1, AHNAK, FGG, TMEM68, ERAP1, ATP6AP, SA...   
lnc2               [SPATA1, FGG, TMEM68, ATP6AP, HUWE1]   
lnc3  [SPATA1, AHNAK, FGG, ERAP1, HZ, SAASDAS, NLRC5...   

                                                Header7  
lnc1  [SPATA1, AHNAK, FGG, TMEM68, ERAP1, HZ, ATP6AP...  
lnc2                           [SPATA1, FGG, ERAP1, HZ]  
lnc3  [SPATA1, AHNAK, TMEM68, ERAP1, HZ, RAD17, NLRC...  

【讨论】:

    猜你喜欢
    • 2019-02-22
    • 2017-07-16
    • 2020-12-22
    • 2018-09-12
    • 1970-01-01
    • 2014-06-12
    • 2021-11-28
    • 2022-01-07
    相关资源
    最近更新 更多