首页 > 解决方案 > 将字典的numpy ndarray转换为DataFrame

问题描述

我已经在 stackoverflow 中搜索了解决方案 -> 但所有解决方案都与我的需求略有不同。

我有一个大的 ndarray(大约 1.07 亿行)让我们称之为df

    [{'A': 5, 'C': 3, 'D': 3},
     {'A': 7, 'B': 9, 'F': 5},
     {'B': 4, 'C': 7, 'E': 6}]

我需要尽可能高效地将其转换为 DataFrame。这是一个示例所需的输出:

     A    B    C    D    E    F
0  5.0  NaN  3.0  3.0  NaN  NaN
1  7.0  9.0  NaN  NaN  NaN  5.0
2  NaN  4.0  7.0  NaN  6.0  NaN

我试过了pd.DataFrame(df)pd.DataFrame.from_dict(df)但这些给了我输出:

     0
0  {'A': 5, 'C': 3, 'D': 3}
1  {'A': 7, 'B': 9, 'F': 5}
2  {'B': 4, 'C': 7, 'E': 6}

问题:如何转换df为所需的输出?

编辑:

我已经尝试过 anky_91 的解决方案。这适用于列表 - 而不是 ndarray。我想避免转换为列表,因为列表中有 1.07 亿个值会导致内存错误。

pd.DataFrame(df).sort_index(axis=1)

这仍然给我与 pd.DataFrame(df) 相同的输出。它输出一个 DataFrame,其中包含一列,每一行都有字典。

标签: pythonpandasnumpydataframe

解决方案


我认为输入数据不同:

L =  [[{'A': 5, 'C': 3, 'D': 3}],
     [{'A': 7, 'B': 9, 'F': 5}],
     [{'B': 4, 'C': 7, 'E': 6}]]

print (pd.DataFrame(L))
                          0
0  {'A': 5, 'C': 3, 'D': 3}
1  {'A': 7, 'B': 9, 'F': 5}
2  {'B': 4, 'C': 7, 'E': 6}

可能的解决方案是展平:

from  itertools import chain
df = pd.DataFrame(chain.from_iterable(L)).sort_index(axis=1)
print (df)
     A    B    C    D    E    F
0  5.0  NaN  3.0  3.0  NaN  NaN
1  7.0  9.0  NaN  NaN  NaN  5.0
2  NaN  4.0  7.0  NaN  6.0  NaN

如果输入数据是 numpy 数组,请使用 @Code 不同的评论中的解决方案:

arr = np.array([{'A': 5, 'C': 3, 'D': 3},
                {'A': 7, 'B': 9, 'F': 5},
                {'B': 4, 'C': 7, 'E': 6}])

df = pd.DataFrame(arr.tolist()).sort_index(axis=1)
print (df)
     A    B    C    D    E    F
0  5.0  NaN  3.0  3.0  NaN  NaN
1  7.0  9.0  NaN  NaN  NaN  5.0
2  NaN  4.0  7.0  NaN  6.0  NaN

推荐阅读