将包含字典的 pandas 列转换为多行

Tay*_*ani 4 python pandas

我有这个数据框

temp = pd.DataFrame({'Person': ['P1', 'P2'], 'Dictionary': [{'value1': 0.31, 'value2': 0.304}, {'value2': 0.324}]})

  Person                    Dictionary    
0  P1  {'value1': 0.31, 'value2': 0.304}
1  P2                  {'value2': 0.324}
Run Code Online (Sandbox Code Playgroud)

我想要这种格式的输出:

temp1 = pd.DataFrame({'Person': ['P1', 'P1', 'P2'], 'Values_Number': ['value1', 'value2', 'value2'], 'Values': [0.31, 0.304, 0.324]})
Run Code Online (Sandbox Code Playgroud)

我尝试使用这个:

temp['Dictionary'].apply(pd.Series).T.reset_index()
Run Code Online (Sandbox Code Playgroud)
  Person Values_Number  Values
0     P1        value1   0.310
1     P1        value2   0.304
2     P2        value2   0.324
Run Code Online (Sandbox Code Playgroud)

但我无法将其与之前的数据框连接起来。此外,我们也会有犯错误的机会。

ans*_*sev 5

IIUC,我们可以使用它Series.tolist来构建一个DataFrame我们可以使用的melt新系统DataFrame.melt

\n\n
new_df = (pd.DataFrame(temp[\'Dictionary\'].tolist(), index=temp[\'Person\'])\n            .reset_index()\n            .melt(\'Person\', var_name=\'Values_Number\', value_name=\'Values\')\n            .dropna()\n            .reset_index(drop=True))\nprint(new_df)\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n
  Person Values_Number  Values\n0     P1        value1   0.310\n1     P1        value2   0.304\n2     P2        value2   0.324\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

它的使用效率pd.DataFrame(df[\'Dictionary\'].tolist()).apply(pd.Series). 您可以看到何时应该apply在代码中使用here

\n\n
\n\n

这是结果apply(pd.Series)这是在本出版物中获得

\n\n
%timeit s.apply(pd.Series)\n%timeit pd.DataFrame(s.tolist())\n\n2.65 ms \xc2\xb1 294 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\n816 \xc2\xb5s \xc2\xb1 40.5 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n