将 pandas DataFrame 的每一行转换为单独的 Json 字符串
Posted
技术标签:
【中文标题】将 pandas DataFrame 的每一行转换为单独的 Json 字符串【英文标题】:Convert each row of pandas DataFrame to a separate Json string 【发布时间】:2018-03-31 13:46:47 【问题描述】:我使用此代码将熊猫 DataFrame df
的每一行转换为 Json 字符串。问题是它正在打印None
,但是df.head()
打印出数据。
import pandas as pd
import json
df = pd.read_csv('mydataset.csv')
for i in df.index:
print df.loc[i].to_json("row.json".format(i))
if i==10:
break
如何获取每一行作为Json字符串变量并打印出来? Json 字符串的结构很简单,没有数组,只有字符串、整数和浮点字段。
【问题讨论】:
@ScottBoston:问题是如何将每一行转换为 json 字符串,因为我的代码不起作用。 【参考方案1】:将apply
与参数axis=1
一起用于按行处理:
df.apply(lambda x: x.to_json("row.json".format(x.name)), axis=1)
如果只想看输出:
df.apply(lambda x: print(x.to_json()), axis=1)
编辑:
使用自定义函数:
def f(x):
a = x.to_json()
print (a)
df.apply(f, axis=1)
【讨论】:
我想在for循环中转换每一行,因为df
很大,也因为我需要在for循环中进行一些处理。
如果我做for row in df.iterrows(): data = row.to_json()
,它不起作用。
好的,谢谢。只是一个小问题。空数据转换为"field1":null
。有什么方法可以将所有空字符串转换为""
?
是的,需要df.fillna("").apply(f, axis=1)
但是我可以将它应用到每一行吗?例如:jsonstring = df.iloc[i].to_json()
,那么我应该如何处理jsonstring
?【参考方案2】:
.to_json(fname)
函数会将数据直接写入 json 文件,不会向您返回任何内容,因此打印不会返回任何内容,但实际文件在您的文件系统中。
更新:如果你想将json字符串保存为python中的变量,那么不要在函数to_json()
中指定文件名参数。你可以这样做:a = df.iloc[0].to_json()
,字符串将被保存到变量a
。
【讨论】:
那么,我怎样才能把这个Json字符串变成一个变量呢?在这种情况下,我想替换为to_json
。
@Dinosaurius 如果在to_json()
函数中没有指定文件名参数,可以在python中保存为变量。【参考方案3】:
我对提出的解决方案不满意并最终这样做:
for chunk in (pd.read_csv(file, sep = ",", header = False, index_col = 0, chunksize=chunk_size)):
json_chunk = chunk.to_json(orient = "records", force_ascii = True, default_handler = None)
当我读取数百万行时,我的解决方案是使用块来完成的。
【讨论】:
天哪!您节省了很多人工。【参考方案4】:感谢这对我使用此方法将最后一列保存为 JSon 有用:
df.assign(ln_A = lambda x: x.to_json()))
【讨论】:
【参考方案5】:为每个数据帧生成一个 json 记录:
for i in df.index:
record = df.iloc[i].to_json()
print(record)
【讨论】:
以上是关于将 pandas DataFrame 的每一行转换为单独的 Json 字符串的主要内容,如果未能解决你的问题,请参考以下文章
在 Pandas 中为 DataFrame 中的每一行返回多行
将一个 pandas DataFrame 的副本合并到另一个 DataFrame 的每一行中?
在 pyspark 的 StructStreaming 中;如何将 DataFrame 中的每一行(json 格式的字符串)转换为多列
遍历 Float 时间戳的 Pandas DataFrame 并转换为日期时间