熊猫 | 将带有列表/类似数组的字段的 json 文件读取到布尔列

Dru*_*ter 5 json boolean dataframe python-3.x pandas

这是一个 JSON 字符串,其中包含一个对象列表,每个对象都嵌入了另一个列表。

[
  {
    "name": "Alice",
    "hobbies": [
      "volleyball",
      "shopping",
      "movies"
    ]
  },
  {
    "name": "Bob",
    "hobbies": [
      "fishing",
      "movies"
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

使用pandas.read_json()它会变成这样的 DataFrame:

  name      hobbies
  --------------------------------------
1 Alice     [volleyball, shopping, movies]
2 Bob       [fishing, movies]
Run Code Online (Sandbox Code Playgroud)

但是,我想将列表展平为这样的布尔列:

  name      volleyball  shopping    movies  fishing 
  ----------------------------------------------------
1 Alice     True        True        True    False
2 Bob       False       False       True    True
Run Code Online (Sandbox Code Playgroud)

即当列表包含一个值时,对应列中的字段用 Boolean 填充True,否则用False.

我也研究过pandas.io.json.json_normalize(),但这似乎也不支持这个想法。是否有任何内置方法(Python3 或 Pandas)来执行此操作?

(PS。我意识到在将整个列表加载到 DataFrame 之前,您可以编写自己的代码来“规范化”字典对象,但我可能会重新发明轮子,并且可能以一种非常低效的方式)。

jez*_*ael 1

crosstab您可以与cast to boolby一起使用astype

df = pd.json_normalize(data, 'hobbies', ['name']).rename(columns={0:'hobby'})
print df
        hobby   name
0  volleyball  Alice
1    shopping  Alice
2      movies  Alice
3     fishing    Bob
4      movies    Bob

print pd.crosstab(df.name, df.hobby).astype(bool)

hobby fishing movies shopping volleyball
name                                    
Alice   False   True     True       True
Bob      True   True    False      False
Run Code Online (Sandbox Code Playgroud)