Python 2.7 导入制表符分隔的数据,每行中也包含一个json

Python 2.7 导入制表符分隔的数据,每行中也包含一个json,python-2.7,pandas,Python 2.7,Pandas,我有一个制表符分隔的数据文件,每行也包含一个json,我在读取它时遇到困难: 502 15 {\"p\":\"car\",\"rooms\":1,\"floors\":2,\"sf\":2000,\"br\":2,\"m\":0} 502 24 {\"p\":\"car\",\"rooms\":2,\"floors\":3,\"sf\":3000,\"br\":2,\"m\":0} 502 03 {\"p\":\"car\",\"rooms\

我有一个制表符分隔的数据文件,每行也包含一个json,我在读取它时遇到困难:

502     15      {\"p\":\"car\",\"rooms\":1,\"floors\":2,\"sf\":2000,\"br\":2,\"m\":0}
502     24      {\"p\":\"car\",\"rooms\":2,\"floors\":3,\"sf\":3000,\"br\":2,\"m\":0}
502     03      {\"p\":\"car\",\"rooms\":9,\"floors\":3,\"sf\":3000,\"br\":2,\"m\":0}
502     66      {\"p\":\"bik\",\"rooms\":9,\"floors\":2,\"sf\":3000,\"br\":2,\"m\":0}
502     28      {\"p\":\"bik\",\"rooms\":5,\"floors\":1,\"sf\":2300,\"br\":2,\"m\":0}
502     27      {\"p\":\"foo\",\"rooms\":5,\"floors\":3,\"sf\":1200,\"br\":2,\"m\":0}
我可以执行csv读取并指定选项卡描述,但最后在数据框中将json作为字符串

from pandas import DataFrame, read_csv
df = read_csv(f,sep='\t')
print df
输出:

   502  15  \
0  502  24   
1  502   3   
2  502  66   
3  502  28   
4  502  27   

  {\"p\":\"car\",\"rooms\":1,\"floors\":2\"sf\":2000,\"br\":2,\"m\":0}  
0  {\"p\":\"car\",\"rooms\":2,\"floors\":3,\"sf\"...                    
1  {\"p\":\"car\",\"rooms\":9,\"floors\":3,\"sf\"...                    
2  {\"p\":\"bik\",\"rooms\":9,\"floors\":2,\"sf\"...                    
3  {\"p\":\"bik\",\"rooms\":5,\"floors\":1,\"sf\"...                    
4  {\"p\":\"foo\",\"rooms\":5,\"floors\":3,\"sf\"...                    

[5 rows x 3 columns]

那么,我该如何更好地理解这一点,或者如何将json字符串列转换为一组常规列,用于“car”、“rooms”、“floors”、“sf”、“br”、“m”?谢谢你的帮助

您需要了解如何为熊猫实现自己的转换器/解析器。请阅读以下内容:

def JsonParser(input):
  import json
  return json.loads(input)
然后,您可以像这样使用此自定义转换器:

df = pandas.read_csv(filepath, names=('field1', 'field2', 'field3') converters={'field3':JsonParser})
一个
df.dtypes
将显示field3是一个
对象

如果此时您希望将json数据转换为dataframe字段,可以执行以下操作:

df.join(df['field3'].apply(pd.Series))
这给了我以下结果:


这不是问题的根本原因,但在json的第一行中,部分内容如下:
“floors\”:2\“sf\”:2000
。所以在2后面缺少一个逗号。这是打字错误还是你的文件有这些不规则之处?谢谢你指出这一点!谢谢你的建议,但是这会将内容拆分为错误的列,并且无法正确解析数据。看起来这使得它想要将每个字段解析为一个单独的json。感谢您指出转换器选项,尽管这可能是正确的。更正了一个输入错误,并用显示我的结果的屏幕截图进行了更新。因为您必须执行
apply
无论如何,我认为将
json.loads
和列创建都移动到apply中更干净(不要将
转换器
用于
read_csv
):
df['field3']。应用(lambda x:pd.Series(json.loads(x)))