将pandas系列的json对象转换为DataFrame

xxe27gdn  于 2023-10-14  发布在  其他
关注(0)|答案(2)|浏览(104)

我试图弄清楚如何将pandas系列的json对象从DataFrame的一个切片转换为一个新的DataFrame,其中键作为列。我试过所有类似的解决方案,但似乎都不起作用。它要么返回相同的序列,要么生成错误。有些行有不同的键,它们并不都一样,元素的数量也不同。变量数量有限,因此每个键都可以有自己的列。有没有办法将这种类型的系列转换为DataFrame?

8ftvxx2r

8ftvxx2r1#

我建议
1.将所有json转换为dict
1.将每个dict转换为DataFrame

  1. concat所有子帧,保留索引
    本例中的数据为series。它还将'替换为"
import json
pd.concat([pd.DataFrame(json.loads(s), index=[ind]) for ind, s in series.str.replace('\'', '"').items()], sort=False)
length  style   width   id      mfg
1   27 mm   Short   9 mm    NaN     NaN
2   51 mm   Long    9 mm    NaN     NaN
5   29 mm   Medium  9 mm    16684   NaN
6   29 mm   Medium  7 mm    NaN     45-163
8   33 mm   Medium  8 mm    NaN     NaN
k2arahey

k2arahey2#

假设你有有效的JSON(e。例如,双引号、有效语法等,请参见Viacheslav Zhukov's answer中的讨论),在您的系列中,您还可以使用

import json
pd.DataFrame(
    my_json_series.apply(json.loads).to_list()
    , index=my_json_series.index  # optional if you want to keep the index
)

避免了for循环/列表解析,并且速度快了很多。
这些步骤相当
1.将每个JSON转换为dict
1.把所有的单词合并成一个列表
1.从列表中创建DataFrame
此外,我没有得到一个正确的MultiIndex与建议的for循环。

In [110]: %%timeit
     ...: my_out_df1 = pd.DataFrame(
     ...:     my_json_series.apply(json.loads).to_list()
     ...:     , index=my_json_series.index  # optional if you want to keep the index
     ...: )
362 ms ± 5.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [111]: %%timeit
     ...: my_out_df_2 = pd.concat(
     ...:     [pd.DataFrame(json.loads(s), index=[ind])
     ...:      for ind, s in my_json_series.items()],
     ...:     sort=False
     ...: )
14.9 s ± 310 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

我必须补充的是,我测试了一个完全不同的系列,我的每个JSON中有4个元素,系列中有大约10,000个元素。

相关问题