【问题标题】:Add padding to values of nested dictionary?向嵌套字典的值添加填充?
【发布时间】:2020-12-06 18:51:45
【问题描述】:

我有嵌套字典events,我想将其放入数据框df,以便以后可以进行箱线图。我面临的主要问题是列表的长度不同。

我的实际字典的较小版本如下所示:

events = { 'gene1' : {'n': [1, 2, 3], 't': [4, 5, 6, 7, 8, 9, 10]},
           'gene2' : {'n': [1, 2, 3, 4], 't': [5, 6, 7, 8, 9, 10, 11, 'nan', 12]}}

我正在尝试将其放入数据框中,但我正在努力处理不同大小的列表。我的代码如下所示:

df = pd.DataFrame(columns=['gene', 'Normal', 'Tumor'])
for key, value in events.items():
       gene_df = pd.DataFrame({'gene':[key]*len(value['t']),
                               'Normal':value['n'],
                               'Tumor':value['t']})
       df = df.append(gene_df)

我得到错误:

ValueError: arrays must all be same length

我在nan 的填充列表解决方案中看到了其他问题,但我不确定如何将其应用于嵌套字典的内部字典值。

想要的输出看起来像这样:

In []: df                                                                      
Out[]: 
    gene Normal Tumor
0  gene1      1     4
1  gene1      2     5
2  gene1      3     6
3  gene1    nan     7
4  gene1    nan     8
5  gene1    nan     9
6  gene1    nan    10
7  gene1    nan   nan
8  gene1    nan   nan
0  gene2      1     5
1  gene2      2     6
2  gene2      3     7
3  gene2      4     8
4  gene2    nan     9
5  gene2    nan    10
6  gene2    nan    11
7  gene2    nan   nan
8  gene2    nan    12

建议?

【问题讨论】:

  • t10之后的两个nan行之间的逻辑是什么?

标签: python pandas dictionary for-loop


【解决方案1】:

您可以将字典中的列表转换为Series

df = pd.DataFrame(columns=['gene', 'Normal', 'Tumor'])
for key, value in events.items():
    gene_df = pd.DataFrame({'gene':[key]*len(value['t']),
                               'Normal':pd.Series(value['n']),
                               'Tumor':pd.Series(value['t'])})
    df = df.append(gene_df)
df

输出:

   gene  Normal Tumor
0   gene1   1.0 4
1   gene1   2.0 5
2   gene1   3.0 6
3   gene1   NaN 7
4   gene1   NaN 8
5   gene1   NaN 9
6   gene1   NaN 10
0   gene2   1.0 5
1   gene2   2.0 6
2   gene2   3.0 7
3   gene2   4.0 8
4   gene2   NaN 9
5   gene2   NaN 10
6   gene2   NaN 11
7   gene2   NaN nan
8   gene2   NaN 12

【讨论】:

    【解决方案2】:

    在使用 DataFrame-Function 中的字典之前,您可以遍历数据以使事件(或基因)中的所有列表长度相同:

    for e in events.keys():
        maxlen = 0
        for col in events[e].keys():
            if len(events[e][col])>maxlen:maxlen=len(events[e][col])
        for col in events[e].keys():
            events[e][col]+=[None]*(maxlen-len(events[e][col]))
    

    这将确保所有列的长度相同,因此您可以使用上面的代码。

    【讨论】:

      【解决方案3】:

      pandas 就像一张桌子,您需要的列表长度相同 您可以将“nan”添加到列表中以使它们的大小相同 或使用其他解决方案

      https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-31
        • 2020-06-08
        • 2016-11-25
        相关资源
        最近更新 更多