读取json并将仅某些json对象写入csv

时间:2018-09-19 19:37:37

标签: python json pandas dataframe

我有一个json,其中对象包含字符串超集的某些子集,例如理想情况下,超集的所有字符串都包含在对象中:

{
  "firstName": "foo",
  "lastName": "bar",
  "age": 20,
  "email":"email@example.com"
        }

但是,有些对象是这样的:

{
  "firstName": "name",
  "age": 40,
  "email":"email@example.com"
        }

仅将超集的每个字符串的对象写入csv的最佳方法是什么?

如果仅是一个字符串为空值的情况,我想我将.dropna与pandas一起使用,它将在csv中省略该行。

我应该估算缺少的字符串,以便每个对象都包含超集,但具有空值吗?如果可以,怎么办?

3 个答案:

答案 0 :(得分:1)

如您所建议,读入熊猫数据框应该可以解决问题。使用大熊猫df.read_json()将为给定json记录中未包含的任何值保留NaN。因此,尝试:

a = pd.read_json(json_string, orient='records') 
a.dropna(inplace=True)
a.to_csv(filename,index=False)

答案 1 :(得分:0)

测试所需的所有值:

x = json.loads(json_string)

if 'firstName' in x and 'lastName' in x and 'age' in x and 'email' in x:
    print 'we got all the values'

else
    print 'one or more values are missing'

或者,更漂亮的方法:

fields = ['firstName', 'lastName', 'age', 'email']
if all(f in x for f in fields):
    print 'we got all the fields'

答案 2 :(得分:0)

假设你有

json_string ='[{ "firstName": "foo", "lastName": "bar", "age": 20, "email":"email@example.com"}, {"firstName": "name", "age": 40,"email":"email@example.com"}]'

那么你可以

l = json.loads(json_string)
df = pd.DataFrame(l)

哪个产量

    age email               firstName   lastName
0   20  email@example.com   foo         bar
1   40  email@example.com   name        NaN

然后

>>> df.to_dict('records')

[{'age': 20,
  'email': 'email@example.com',
  'firstName': 'foo',
  'lastName': 'bar'},
 {'age': 40,
  'email': 'email@example.com',
  'firstName': 'name',
  'lastName': nan}]

>>> df.to_json()

'{"age":{"0":20,"1":40},"email":{"0":"email@example.com","1":"email@example.com"},"firstName":{"0":"foo","1":"name"},"lastName":{"0":"bar","1":null}}'

拥有data frame的好处是,您可以根据需要解析/处理数据,然后再将其重新设置为字典/ json。