将 Pandas 行中带有字典的核心系列转换为 Pandas 数据框

Convert a Pandas Core Series with Dictionary in Rows into Pandas Dataframe

我有一个名为 "series_1" 的 Pandas 核心系列,它的每一行都有三个变量("V-Ratio"、"Z-score"、"P")的字典。它看起来像这样:

V1    [{'V-Ratio': 0.98, 'Z-score': -0.94, 'P': 0.17}]
V2    [{'V-Ratio': 0.97, 'Z-score': -1.34, 'P': 0.09}]
V3     [{'V-Ratio': 1.03, 'Z-score': 1.21, 'P': 0.89}]
V4     [{'V-Ratio': 1.04, 'Z-score': 1.41, 'P': 0.92}]
V5    [{'V-Ratio': 0.99, 'Z-score': -0.42, 'P': 0.34}]
V6    [{'V-Ratio': 0.96, 'Z-score': -1.72, 'P': 0.04}]
V7      [{'V-Ratio': 1.02, 'Z-score': 0.7, 'P': 0.76}]
V8    [{'V-Ratio': 0.97, 'Z-score': -1.09, 'P': 0.14}]
V9     [{'V-Ratio': 0.98, 'Z-score': -0.7, 'P': 0.24}]
V10     [{'V-Ratio': 0.76, 'Z-score': -9.31, 'P': 0.0}]
V11     [{'V-Ratio': 0.83, 'Z-score': -6.74, 'P': 0.0}]
V12    [{'V-Ratio': 0.92, 'Z-score': -3.14, 'P': 0.0}]
V13     [{'V-Ratio': 0.92, 'Z-score': -3.23, 'P': 0.0}]
V14     [{'V-Ratio': 0.87, 'Z-score': -4.99, 'P': 0.0}]
V15     [{'V-Ratio': 1.02, 'Z-score': 0.75, 'P': 0.77}]
V16       [{'V-Ratio': 0.9, 'Z-score': -3.7, 'P': 0.0}]
V17     [{'V-Ratio': 0.95, 'Z-score': -2.1, 'P': 0.02}]

我想将其转换成如下所示的 Pandas 数据框:

    V-Ratio Z-score  P
V1  0.98   -0.94    0.17
V2  0.97    1.34    0.09
V3  1.03    1.21    0.89
V4  1.04    1.41    0.92
V5  0.99   -0.42    0.34
.........................
.........................
.........................

我尝试过的:

  1. "series = pd.DataFrame(series_1)" 给我一个带有一列的数据框,其中包含包含行中变量的字典。
  2. "series = pd.DataFrame([series_1])" 没有达到我的结果。
  3. "series = pd.DataFrame(series_1, index=[0])" 无效。

有人知道如何解决我的问题吗?

请检查

column 表示您拥有字典列表的列名。

df = df[column].apply(pd.Series)[0].apply(pd.Series)

输出

    V-Ratio Z-score P
V1  0.98    -0.94   0.17
V2  0.97    -1.34   0.09
V3  1.03    1.21    0.89
V4  1.04    1.41    0.92
V5  0.99    -0.42   0.34

我认为主要问题是,V1、V2、...中的每一个都是字典列表,但是每个列表中只有 1 个元素。 理想情况下,你会想要

[{'V-Ratio': 0.98, 'Z-score': -0.94, 'P': 0.17}, {'V-Ratio': 0.97, 'Z-score': -1.34, 'P': 0.09}, ....],每个元素对应V1V2等,但是你有[[{'V-Ratio': 0.98, 'Z-score': -0.94, 'P': 0.17}], [{'V-Ratio': 0.97, 'Z-score': -1.34, 'P': 0.09}], ....],请检查一下。 之后,您可以尝试您执行的步骤,或者使用 .tolist() 将系列转换为列表并转换为数据帧。

如果您无法更改它,则只需将每个系列列表的第一个元素转换为数据框

试试这个 你需要先从你的 list

中获取 dict
# here, `s` is your series
df = s.str[0].apply(pd.Series)      
df
    V-Ratio  Z-score     P
v1     0.98    -0.94  0.17
v2     0.97    -1.34  0.09
v3     1.03     1.21  0.89
......

df = s.apply(lambda x: pd.Series(x[0]))