将pandas数据框保存为不含NaN值的单独JSON文件。

7 浏览
0 Comments

将pandas数据框保存为不含NaN值的单独JSON文件。

我有一个带有一些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]])

它看起来像这样:

enter image description here

为了得到一个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文件有两行数据,但没有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文件

0
0 Comments

将Pandas DataFrame保存为多个不含NaN值的JSON文件的原因是,有时候我们希望将DataFrame中的数据按行保存为多个JSON文件,并且希望在保存的过程中去除含有NaN值的列。

为了解决这个问题,我们可以使用以下代码来实现:

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")

以上代码将DataFrame逐行遍历,并将每行的索引和不含NaN值的数据转换为JSON格式,然后保存到单独的JSON文件中。在保存过程中,使用`dropna()`方法去除含有NaN值的列,以保证保存的JSON文件不含有NaN值的数据。

通过使用以上代码,我们可以将DataFrame保存为多个不含NaN值的JSON文件,从而满足特定的需求。

0
0 Comments

问题的出现原因:原始的数据框中的某些列存在NaN值,但是在保存为JSON文件时,希望将这些NaN值排除掉。

解决方法:使用apply函数删除NaN值,使用groupby函数进行分组,再使用dfGroupBy.apply函数将数据框转化为JSON格式。

首先,使用apply函数删除NaN值,并将每一行转化为字典形式:

s = sample_df.apply(lambda x: x.dropna().to_dict(), 1)

然后,使用groupby函数将数据按照每两行分组:

grouped_df = s.groupby(sample_df.index // 2)

接下来,使用apply函数将每组数据转化为JSON格式:

jsonified_df = grouped_df.apply(lambda x: x.to_json(orient='records'))

最后,使用循环遍历jsonified_df的values,并将每个值保存为单独的JSON文件:

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

如果想要在将数据保存为JSON文件时,将原始数据框的索引改为字符串类型的列,且保持相同的输出结果,可以使用np.arange(df.shape[0]) // 2来代替sample_df.index // 2。

如果以上解释不清楚,请提出新的问题进行进一步讨论。

0