【问题标题】:Saving a pandas dataframe to separate jsons without NaNs保存熊猫数据框以分隔没有 NaN 的 json
【发布时间】:2018-02-20 07:26:19
【问题描述】:

我有一个包含一些 NaN 值的数据框。

这是一个示例数据框:

sample_df = pd.DataFrame([[1,np.nan,1],[2,2,np.nan], [np.nan, 3, 3], [4,4,4],[np.nan,np.nan,5], [6,np.nan,np.nan]])

看起来像:

我在得到一个 json 之后做了什么:

sample_df.to_json(orient = 'records')

这给出了:

'[{"0":1.0,"1":null,"2":1.0},{"0":2.0,"1":2.0,"2":null},{"0":null,"1":3.0,"2":3.0},{"0":4.0,"1":4.0,"2":4.0},{"0":null,"1":null,"2":5.0},{"0":6.0,"1":null,"2":null}]'

我想将此数据帧保存到一个 json 中,每个 json 中有 2 行,但没有 Nan 值。以下是我尝试的方法:

df_dict = dict((n, sample_df.iloc[n:n+2, :]) for n in range(0, len(sample_df), 2))

for k, v in df_dict.items():
    print(k)
    print(v)
    for d in (v.to_dict('record')):
        for k,v in list(d.items()):
            if type(v)==float:
                if math.isnan(v):
                    del d[k]

json.dumps(df_dict)

我想要的输出:

'[{"0":1.0,"2":1.0},{"0":2.0,"1":2.0}]' -> 在一个 .json 文件中 '[{"1":3.0,"2":3.0},{"0":4.0,"1":4.0,"2":4.0}]' -> 在第二个 .json 文件中 '[{"2":5.0},{"0":6.0}]' -> 在第三个 .json 文件中

【问题讨论】:

  • Dataframe + 预期输出会有很大帮助!谢谢。
  • @cᴏʟᴅsᴘᴇᴇᴅ 添加!抱歉没有提供足够的细节。

标签: python json pandas dataframe nan


【解决方案1】:

使用applyNaNs 删除,groupby 用于分组,dfGroupBy.apply 用于 JSONify。

s = sample_df.apply(lambda x: x.dropna().to_dict(), 1)\
        .groupby(sample_df.index // 2)\
        .apply(lambda x: x.to_json(orient='records'))
s    

0            [{"0":1.0,"2":1.0},{"0":2.0,"1":2.0}]
1    [{"1":3.0,"2":3.0},{"0":4.0,"1":4.0,"2":4.0}]
2                            [{"2":5.0},{"0":6.0}]
dtype: object

最后,遍历 .values 并保存到单独的 JSON 文件中。

import json
for i, j_data in enumerate(s.values):
    json.dump(j_data, open('File{}.json'.format(i + 1), 'w'))

【讨论】:

  • 如果我将原始数据框的索引更改为数据中包含字符串的列并且我想要相同的输出怎么办?我收到错误 TypeError: cannot perform floordiv with this index type: .
  • @pr338 使用np.arange(df.shape[0]) // 2
  • 对不起,我不清楚。我的意思是索引的输出是一个字符串,如 "indexhere" [{"fund.numeric.returnY3CategoryRank":0,"fund...。如果这仍然不清楚,将用另一个示例编辑原始问题。
  • @pr338 啊,对不起……事情变得一团糟。你能问一个新问题吗?
【解决方案2】:

我建议:

with open("data.json","w") as fpout:
    fpout.write("{\n")
    for row_id in range(sample_df.shape[0]):
        fpout.write("\t" + str(sample_df.index[row_id]) + ":" + sample_df.iloc[row_id].dropna().to_json(orient="index") + "\n")
    fpout.write("}\n")

【讨论】:

    猜你喜欢
    • 2017-01-03
    • 2015-04-19
    • 1970-01-01
    • 2020-05-22
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多