Python 熊猫能否在CSV中编写列表和dict以及格式良好的JSON blob?

Python 熊猫能否在CSV中编写列表和dict以及格式良好的JSON blob?,python,pandas,Python,Pandas,举例来说: import pandas as pd x = pd.DataFrame({'id': [1], 'parsed_json': [[{'a': False}]]}) x.to_csv(index=False) # Returns: # id,list_col # 1,[{'a': False}] 值得注意的是,第二列不是有效的JSON。这对我来说是个问题,因为read\u sql会自动将JSON和其他文本数组解析为Python本机数据类型。我找不到关闭该功能的方法,也找不到在编

举例来说:

import pandas as pd

x = pd.DataFrame({'id': [1], 'parsed_json': [[{'a': False}]]})
x.to_csv(index=False)

# Returns:
# id,list_col
# 1,[{'a': False}]
值得注意的是,第二列不是有效的JSON。这对我来说是个问题,因为
read\u sql
会自动将JSON和其他文本数组解析为Python本机数据类型。我找不到关闭该功能的方法,也找不到在编写CSV时强制对列表/目录进行正确的JSON格式设置的方法(我认为这更可取);如果两者都不能做到,那么如果用户不编写自定义函数,read_sql对JSON所做的事情是不可逆的。我写了一篇适合我的文章:

def rejsonify_df(df):
    if df.shape[0] == 0:
        return df
    cols_to_json = [c for c in df.columns
                    if isinstance(df[c][0], dict)
                    or isinstance(df[c][0], list)]
    df[cols_to_json] = [df[c].to_json() for c in cols_to_json]
    return df

rejsonify_df(x).to_csv(index=False)

但本地解决方案会更好。如果我是第一个或最后一个遇到这个问题的人,我会感到惊讶,我很好奇是否有更好的解决方案。

我不认为熊猫本身正在进行JSON解析。我查看了read_sql的源代码,但没有看到它

要么是数据库驱动程序,要么是SQLAlchemy。我猜是数据库驱动程序。我们看到的所有类型都是Python本机类型

您所要求的是——自动将来自JSON的数据序列化回JSON——听起来很简单,但有点棘手。数据帧必须跟踪数据来源的元数据。然后你必须回答这样的问题,一个作为dict加载的postgres hstore列是否应该通过to_csv序列化回JSON

一般来说,尝试自动管理pandas支持的所有不同序列化模式之间的类型转换会变得非常复杂。我认为熊猫在这里做的事情是正确的,他们不想太聪明


如果我是你,我可能只是将所有列转换为JSON,这取决于文件中的其他内容。毕竟,您也可以用JSON表示数字和字符串,而不仅仅是列表和dict。

My
pandas.read\u sql
不会解析JSON。关于
Series.to_json
它为什么不够原生?什么版本?我使用的是Python 3.6.1/0.22.0。至于“不够土生土长”,如果有多人必须解决这个确切的问题,让他们都想出自己的解决办法是低效和容易出错的。事实上,我的解决方案会对内存造成严重破坏(我欢迎这里的建议),而本机实现的JSON转换可以更容易地避免这种情况。此外,更抽象地说,让与ETL相关的函数尽可能容易地互操作/可逆(无需自定义用户诡计)是一个简单的好设计。我可以通过在我的选择中将它们转换为
varchar
来解决这个问题,但我仍然认为关于将
to_csv
格式列表和dicts转换为JSON(如果已经进行了讨论,我会好奇为什么不支持该功能)。您可以使用
to_string()
格式化程序
关键字中使用
json.dumps()
,但由于任何原因
to_csv()
没有这样的关键字。如果只是为了一致性的话,它应该是可逆的。如果您要转储到SQL,那么有理由期望它能够正常工作。但是您不能在不同的序列化驱动程序之间具有可逆性,因为它们具有不同的类型。您所能做的最好的事情就是为每个序列化程序提供一个中间表示(Python本机类型),并具有合理的默认值。在所有驱动程序之间进行类型映射将是m*n^2,其中n是驱动程序的数量,m是类型的数量,这是不可管理的。非常感谢您的深思熟虑和深刻的评论!我没有想到这种解析会发生在驱动端,熊猫/驱动类型映射的逻辑听起来确实不可行。在我看来,编写CSV(不包括SQL内容)列表和目录不会被序列化为JSON,这一点在我看来很奇怪,而且鉴于许多SQL发行版对JSON字段的支持,这似乎是一个有用的选项;但我认为做出这些决定有很好的理由(一如既往的好奇,但如果我没有得到答案,我会理解!)(说得很清楚,我的意思是先验的评论反映了我的想法,这最终可能会被忽略。然而,我确实认为选择可能是一件有用的事情……).我想他们只是选择了一个简单而愚蠢的解决方案,写“repr”或“string”表示法,不知道是哪一种。编写JSON表示(或至少拥有该选项)听起来并不疯狂,但在默认情况下这样做也会引发一些问题——如果在一个列中同时具有DICT和非JSON可序列化结构,该怎么办?如果你有听写和字符串呢?你是把一切都写上JSON,还是只写上口述?我认为他们只是把这些问题留给用户,因为它是特定于用例的,所以不幸的是,您必须为您的用例编写自定义代码。