如何将python JSON行转换为dataframe列而不进行循环

时间:2016-10-25 12:53:41

标签: python pandas dataframe

我试图弄清楚如何在不使用循环的情况下执行以下操作。

我有一个包含多个列的数据框,其中一列包含JSON字符串。我要做的是将JSON字符串列转换为数据框中自己的列。例如,我有以下数据框:

Column 1 | column 2 | Json Column

 123     | ABC      | {"anotherNumber":345,"anotherString":"DEF"}

我想转换成这个:

Column 1 | column 2 | anotherNumber | anotherString

 123     | ABC      | 345           | DEF 

2 个答案:

答案 0 :(得分:1)

如果有必要,您可以Json Column首先将dict转换为json.loads

import json

df = pd.DataFrame({'Column 1':[123],
                   'Column 2':['ABC'], 
                   'Json Column':['{"anotherNumber":345,"anotherString":"DEF"}']})
print (df)

   Column 1 Column 2                                     Json Column
0       123      ABC  {'anotherString': 'DEF', 'anotherNumber': 345}

print (type(df.ix[0,'Json Column']))
<class 'str'>

df['Json Column'] =  df['Json Column'].apply((json.loads))

print (type(df.ix[0,'Json Column']))
<class 'dict'>

然后生成列表列表并从构造函数创建Dataframe

print (df['Json Column'].values.tolist())
[{'anotherString': 'DEF', 'anotherNumber': 345}]

df1 = pd.DataFrame(df['Json Column'].values.tolist())
print (df1)
   anotherNumber anotherString
0            345           DEF

上一次concat为原始版本,drop删除了列Json Column

print (pd.concat([df.drop('Json Column', axis=1), df1], axis=1))
   Column 1 Column 2  anotherNumber anotherString
0       123      ABC            345           DEF

答案 1 :(得分:0)

  1. 阅读时将String转换为Json的标准步骤
import json
import pandas as pd

df = pd.DataFrame({'Column 1':[123],
               'Column 2':['ABC'], 
               'Json_Column':['{"anotherNumber":345,"anotherString":"DEF"}']})
df
    Column 1    Column 2    Json_Column
0        123         ABC    {"anotherNumber":345,"anotherString":"DEF"}

df.Json_Column = df.Json_Column.apply(lambda x: json.loads(x))

df.Json_Column
0    {'anotherNumber': 345, 'anotherString': 'DEF'}
Name: Json_Column, dtype: object
  1. 将每个json行转换为数据框
df.Json_Column = df.Json_Column.apply(lambda x: pd.DataFrame([x]))

df.Json_Column
0       anotherNumber anotherString
0            34...
Name: Json_Column, dtype: object
  1. 将所有行中存在的数据框连接到单个数据框
import functools
temp_json_df = functools.reduce(lambda x,y: pd.concat([x,y]), df.Json_Column)

temp_json_df
   anotherNumber    anotherString
0            345              DEF
  1. 合并master和temp_json_df
df = pd.concat([df.drop(columns='Json_Column'), temp_json_df], axis=1)

df
 Column 1   Column 2    anotherNumber   anotherString
0    123         ABC              345            DEF