将 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
.........................
.........................
.........................
我尝试过的:
- "series = pd.DataFrame(series_1)" 给我一个带有一列的数据框,其中包含包含行中变量的字典。
- "series = pd.DataFrame([series_1])" 没有达到我的结果。
- "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}, ....]
,每个元素对应V1
,V2
等,但是你有[[{'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]))
我有一个名为 "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
.........................
.........................
.........................
我尝试过的:
- "series = pd.DataFrame(series_1)" 给我一个带有一列的数据框,其中包含包含行中变量的字典。
- "series = pd.DataFrame([series_1])" 没有达到我的结果。
- "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}, ....]
,每个元素对应V1
,V2
等,但是你有[[{'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]))