【问题标题】:How to solve index column issue in Panda while converting to json file?转换为 json 文件时如何解决 Panda 中的索引列问题?
【发布时间】:2020-05-14 23:47:34
【问题描述】:

有一个熊猫数据框如下:

df

我想用这个命令df.to_json(os.path.join(path, 'test.json'))创建一个json文件

我想要的输出是

{"Big": {"A": "Big", "B": [["rose", 100], ["camelia", 200], ["Lily", 300]], }, "Medium": {"A": "Medium", "B": [["house", 45], ["car", 30], ["money", 56]], }}

相反,我得到的输出是:

{"A":{"0":"Big","1":"Medium",},"B":{"0":[["rose", 100], ["camelia", 200], ["Lily", 300]], "1":[[["house", 45], ["car", 30], ["money", 56]] }}

我还尝试将 A 列作为我的索引列 df=df.set_index('A')。 但这给了我更困惑的答案:

{"B":{"Big":[":[["rose", 100], ["camelia", 200], ["Lily", 300]],"Medium":[["house", 45], ["car", 30], ["money", 56]]}}

谁能帮我解决这个问题?

【问题讨论】:

  • 不是显示 Excel 文件,而是在阅读后显示您的 DataFrame。还有一个非常重要的细节:不要传递图片。显示可以轻松复制的文本内容。我们没有时间手动重写您图片中的内容。

标签: json pandas


【解决方案1】:

您似乎读取了调用以下命令的 Excel 文件:

df = pd.read_excel('Input.xlsx', skiprows=2, index_col=0, names=[None, 'A', 'B'])

即:

  • skiprows=2 - 跳过 2 个初始空行,
  • index_col=0 - 将列 0(在 Excel 中 - 列 A)设置为索引,
  • names=... - 忽略现有的列名(第 3 行 - 没有索引, FruitFlowers 用于数据列)并从 给定的列表。

DataFrame 这样包含:

        A                                         B
0     Big  [(rose:100), (camelia:200), (Lily: 300)]
1  Medium       [(house:45), (car:30), (money: 56)]

这应该是您帖子的实际开始(而不是 Excel 屏幕截图)。

要获得与您想要的结果相似的 JSON 输出,您可以运行:

df.set_index('A', drop=False).to_json('Output.json', orient='index')

结果(为便于阅读而美化)是:

{
  "Big"   : {"A": "Big",    "B":"[(rose:100), (camelia:200), (Lily: 300)]"},
  "Medium": {"A": "Medium", "B":"[(house:45), (car:30), (money: 56)]"}
}

区别在于B栏:整个内容是一个单个字符串, 例如"[(rose:100), (camelia:200), (Lily: 300)]",而你想要 [["rose", 100], ["camelia", 200], ["Lily", 300]],即列表列表。

如果这个细节很重要,你可以重新格式化B栏:

df.B = df.B.str.extractall(r'\((?P<name>\w+) *: *(?P<num>\d+)\)')\
    .astype({'num': 'int'}).apply(list, axis=1).unstack()\
    .apply(lambda lst: lst.dropna().tolist(), axis=1)

然后之后保存为 JSON。这一次的结果正是你所需要的。

上面的转换涉及到几个步骤,可能有点难 对于没有经验的读者。 要完全理解它的工作原理,请分别执行每个步骤 然后检查每个步骤的结果。

我只添加 lambda 函数的最后一个 apply (而不是 如果匹配的数量来自 extractall 在特定行中是不同的。 在这种情况下,必须过滤掉 NaN 个条目。

【讨论】:

  • 实际上我的 B 列目标类型是一个列表。但如果它是一个字符串,仍然可以使用。所以方向对我有用。
  • 有没有办法为 A 列中的每个元素绘制数据框 B 列(这些元素是元组)?我尝试从原始数据集中提取 B 列,然后绘制 B(通过使用元组绘图),但为此我必须使用 FOR 循环为不同窗口中 B 列的每个元素创建绘图。我正在尝试将其绘制在一个窗口中,标题为 A 列元素。
  • 这对于另一个问题来说相当重要。 “逐渐扩展”最初的问题是一个坏习惯。
  • 已经以单独且更易于理解的方式询问。希望这可能会奏效。 stackoverflow.com/questions/61801619/…
猜你喜欢
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 2019-09-10
相关资源
最近更新 更多