如何将 pandas DataFrame 行保存为 JSON 字符串?

Posted

技术标签:

【中文标题】如何将 pandas DataFrame 行保存为 JSON 字符串?【英文标题】:How to save pandas DataFrame's rows as JSON strings? 【发布时间】:2018-06-22 22:30:10 【问题描述】:

我有一个 pandas DataFrame df,我将每一行转换为 JSON 字符串,如下所示:

df = pd.DataFrame(np.random.randn(50, 4), columns=list('ABCD'))
df_as_json = df.to_json(orient='records')

然后我想对df_as_json的JSON字符串(行)进行迭代,进一步处理如下:

for json_document in df_as_json.split('\n'):
    jdict = json.loads(json_document)
    //...

问题在于 df_as_json.split('\n') 并没有真正将 df_as_json 拆分为单独的 JSON 字符串。

我该怎么做?

【问题讨论】:

所以你希望数据帧的每一行都作为一个字典? 您可以尝试打印您的df_as_json。它包含方括号并且没有\n,所以它不起作用。 @StephenRauch 的解决方案应该非常适合您的情况。 @PangeranBottor 不,如果您想将 JSON 文件保存为 JSON 行,那么 to_json 支持 lines=True 参数。见here。 由于某种原因lines=True 不适合我。我收到关于未知参数的错误。 @Markus 你必须更新你的熊猫版本。最新的稳定版本是 0.22。 【参考方案1】:

另一种方法是

input_data=[row.to_json() for index,row in dataset.iterrows()]

【讨论】:

【参考方案2】:

从 v0.19 开始,您可以使用 to_jsonlines=True 参数将数据保存为 JSON lines file。

df.to_json('file.json', orient='records', lines=True)

这消除了保存每条记录的循环的需要,因为to_dict 的解决方案将涉及。

file.json 的前 5 行是这样的 -

"A":0.0162261253,"B":0.8770884013,"C":0.1577913843,"D":-0.3097990255
"A":-1.2870077735,"B":-0.1610902061,"C":-0.2426829569,"D":-0.3247587907
"A":-0.7743891125,"B":-0.9487264737,"C":1.6366125588,"D":0.2943377348
"A":1.5128287075,"B":-0.389437321,"C":0.4841038875,"D":0.5315466818
"A":-0.1455759399,"B":1.0205229385,"C":0.6776108196,"D":0.832060379

【讨论】:

【参考方案3】:

要将数据框的每一行作为dict,您可以使用pandas.DataFrame.to_dict()

代码:

df = pd.DataFrame(np.random.randn(10, 4), columns=list('ABCD'))
for jdict in df.to_dict(orient='records'):
    print(jdict)

结果:

'A': -0.81155648424969018, 'B': 0.54051722275060621, 'C': 2.1858014972680886, 'D': -0.92089743800379931
'A': -0.051650790117511704, 'B': -0.79176498452586563, 'C': -0.9181773278020231, 'D': 1.1698955805545324
'A': -0.59790963665018559, 'B': -0.63673166723131003, 'C': 1.0493603533698836, 'D': 1.0027811601157812
'A': -0.20909149867564752, 'B': -1.8022674158328837, 'C': 1.0849019267782165, 'D': 1.2203116471260997
'A': 0.33798033123267207, 'B': 0.13927004774974402, 'C': 1.6671536830551967, 'D': 0.29193412587056755
'A': -0.079327003827824386, 'B': 0.58625181818942929, 'C': -0.42365912798153349, 'D': -0.69644626255641828
'A': 0.33849577559616656, 'B': -0.42955248285258169, 'C': 0.070860788937864225, 'D': 1.4971679265264808
'A': 1.3411846077264038, 'B': -0.20189961315847924, 'C': 1.6294881274421233, 'D': 1.1168181183218009
'A': 0.61028134135655399, 'B': 0.48445766812257018, 'C': -0.31117315672299928, 'D': -1.7986688463810827
'A': 0.9181074339928279, 'B': 0.84151139156427757, 'C': -1.111794854210024, 'D': -0.7131446510569609

【讨论】:

以上是关于如何将 pandas DataFrame 行保存为 JSON 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Pandas DataFrame 的列和行子集转换为 numpy 数组?

Pandas将dataframe保存为pickle文件并加载保存后的pickle文件查看dataframe数据实战

pandas读取csv数据为dataframe如果dataframe中相连两行数据(记录)的时间差超过指定阈值则保存时间较小行中指定数据列的值到列表中

pandas读取csv数据为dataframe如果dataframe中相连两行数据(记录)的时间差超过指定阈值则保存时间较小行中指定数据列的值到列表中

将 Pandas DataFrame 的行转换为列标题,

将 Pandas DataFrame 和元数据保存为 JSON 格式