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