Python 如何从列中指定的列表创建子列

Python 如何从列中指定的列表创建子列,python,pandas,dataframe,Python,Pandas,Dataframe,如何创建嵌套在dataframe列中的列表外列 我有一个具有以下值的数据帧: 我希望将消息列中的数据拆分为子列,例如 到目前为止,我已经在逗号的基础上拆分了数据 因为数据不是json格式,所以我不能对其使用json.loads。我使用下面的代码将其拆分 key = [] for i in df['text']: i = i.replace("{", "") i = i.replace("}", "") for

如何创建嵌套在dataframe列中的列表外列

我有一个具有以下值的数据帧:

我希望将消息列中的数据拆分为子列,例如

到目前为止,我已经在逗号的基础上拆分了数据

因为数据不是json格式,所以我不能对其使用json.loads。我使用下面的代码将其拆分

key = []
for i in df['text']:
i = i.replace("{", "")
i = i.replace("}", "")
for x in i.split(","):
    key.append(x.split(": "))
key[0]
给出一个输出 ['HashCode','650e4390:0']

在此之后,由于{}之前和之后的模式不固定,因此我一直在思考如何在此基础上创建数据帧

使用ast和json时出错


由于字符串不是json,因为在某些行中,}大括号缺失

您也可以使用
ast.literal\u eval
后跟
apply(pd.Series)
pd.concat

import ast
df['x'] = df['x'].apply(lambda x : ast.literal_eval(x))
df1 = df['x'].apply(pd.Series)
res = pd.concat([df, df1], axis=1).drop('message', axis=1)

您还可以使用
ast.literal\u eval
后跟
apply(pd.Series)
pd.concat

import ast
df['x'] = df['x'].apply(lambda x : ast.literal_eval(x))
df1 = df['x'].apply(pd.Series)
res = pd.concat([df, df1], axis=1).drop('message', axis=1)

更有效的选项是将这些值与以下值串联并读取:

输出:

   a    b
0  1  foo
1  3  bar
与其他一些给定解决方案的性能比较:

%%timeit
pd.read_json(df['json'].str.cat(sep='\n'), lines=True)
44.2 ms ± 1.23 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%%timeit
pd.DataFrame([json.loads(x) for x in df['json']], index=df.index)
88.9 ms ± 1.34 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%%timeit
pd.DataFrame([ast.literal_eval(x) for x in df['json']], index=df.index)
335 ms ± 3.72 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
df['json'].apply(lambda x : ast.literal_eval(x)).apply(pd.Series)
6.83 s ± 212 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
在以下数据帧上测试性能:

df = pd.DataFrame({'json': ['{"a": 1, "b": 2}', '{"c": 3, "d": "z"}']*10000})

更有效的选项是将这些值与以下值串联并读取:

输出:

   a    b
0  1  foo
1  3  bar
与其他一些给定解决方案的性能比较:

%%timeit
pd.read_json(df['json'].str.cat(sep='\n'), lines=True)
44.2 ms ± 1.23 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%%timeit
pd.DataFrame([json.loads(x) for x in df['json']], index=df.index)
88.9 ms ± 1.34 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%%timeit
pd.DataFrame([ast.literal_eval(x) for x in df['json']], index=df.index)
335 ms ± 3.72 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
df['json'].apply(lambda x : ast.literal_eval(x)).apply(pd.Series)
6.83 s ± 212 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
在以下数据帧上测试性能:

df = pd.DataFrame({'json': ['{"a": 1, "b": 2}', '{"c": 3, "d": "z"}']*10000})

如何创建数据帧?如果来自json,是否可以向问题添加一些示例json数据?如何创建
DataFrame
?如果来自json,是否可以向问题中添加一些示例json数据?解决方案很慢,因为
apply(pd.Series)
的性能很差,请检查@jezrael:准确地说,它比我的解决方案慢约150倍,比您在20k列上建议的
json.loads
选项慢约100倍。我已经将它添加到我的基准测试解决方案中,因为
apply(pd.Series)
的性能很差,请检查@jezrael:确切地说,它比我的解决方案慢约150倍,比您在20k专栏中建议的
json.loads
选项慢约100倍。我已将其添加到基准中