Python 将数据帧中的每个列列表元素转换为JSON

Python 将数据帧中的每个列列表元素转换为JSON,python,pandas,Python,Pandas,我一直在尝试将包含列表元素的pandas dataframe列转换为json,并将其作为一个变体推送到snowflake,但我仍停留在第一步 我有一个带有ID和对话记录的熊猫数据框,看起来是这样的 示例数据帧: ID transcript 1 ['Joe(joe@email.com): Hey', 'Smoe(smoe@email.com): Hey!! How are you doing?', 'Joe(joe@email.com): I'm doing good'] I

我一直在尝试将包含列表元素的pandas dataframe列转换为json,并将其作为一个变体推送到snowflake,但我仍停留在第一步

我有一个带有ID和对话记录的熊猫数据框,看起来是这样的

示例数据帧:

ID   transcript
1     ['Joe(joe@email.com): Hey', 'Smoe(smoe@email.com): Hey!! How are you doing?', 'Joe(joe@email.com): I'm doing good']
    ID   transcript
    1     {'Joe(joe@email.com): Hey', 'Smoe(smoe@email.com): Hey!! How are you doing?', 'Joe(joe@email.com): I'm doing good'}
而且,我有多行(不同ID的对话记录)格式相同

预期数据帧:

ID   transcript
1     ['Joe(joe@email.com): Hey', 'Smoe(smoe@email.com): Hey!! How are you doing?', 'Joe(joe@email.com): I'm doing good']
    ID   transcript
    1     {'Joe(joe@email.com): Hey', 'Smoe(smoe@email.com): Hey!! How are you doing?', 'Joe(joe@email.com): I'm doing good'}
我试图将每个单独的对象转换为json,但列表对象没有“to_json”属性

df['transcript_json'] = df['transcript_json'].apply(lambda x: x.to_json())
我还尝试将整个列转换为一个json对象,它给了我一个大字符串对象,但没有让我走得更远

transcript_list = df['transcript'].to_json()

{"0":["Joe(joe@email.com): Hey", "Smoe(smoe@email.com): Hey!! How are you doing?", "Joe(joe@email.com): I'm doing good"]}

我知道我错过了一些小东西。任何关于如何做到这一点的想法都将不胜感激。

不清楚我们希望最终结果是什么。您的预期原始值仅将这些[]更改为这些{}。如果您想要一个具有可用键:值对的字典,这里有一种将字符串更改为dictionary的bastardized方法。问题是,当电子邮件地址(密钥)相同时,您会丢失任何元素

data='''
ID   transcript
1   ['Joe(joe@email.com): Hey', 'Smoe(smoe@email.com): Hey!! How are you doing?', 'Joe(joe@email.com): I'm doing good']
'''
df = pd.read_csv(io.StringIO(data), sep='   ', engine='python')
df['transcript'] = df['transcript'].apply(lambda x: x.replace(': ', '": "').replace("['", '{"').replace("']", '"}').replace("', '", '", "'))
print(df['transcript'].apply(lambda x: type(x)))
df['transcript'].apply(lambda x: json.loads(x))
输出

0    <class 'str'>
Name: transcript, dtype: object

0    {'Joe(joe@email.com)': 'I'm doing good', 'Smoe(smoe@email.com)': 'Hey!! How are you doing?'}
Name: transcript, dtype: object
0
姓名:转录本,数据类型:对象
0{'(joe@email.com)“:“我做得很好,”斯莫说(smoe@email.com)“:‘嘿!!你好吗?’
姓名:转录本,数据类型:对象

为了不丢失任何数据,您需要列表对象的真正格式是什么?是否可以是一个格式正确的键:值对列表?

不清楚最终结果是什么。您的预期原始值仅将这些[]更改为这些{}。如果您想要一个具有可用键:值对的字典,这里有一种将字符串更改为dictionary的bastardized方法。问题是,当电子邮件地址(密钥)相同时,您会丢失任何元素

data='''
ID   transcript
1   ['Joe(joe@email.com): Hey', 'Smoe(smoe@email.com): Hey!! How are you doing?', 'Joe(joe@email.com): I'm doing good']
'''
df = pd.read_csv(io.StringIO(data), sep='   ', engine='python')
df['transcript'] = df['transcript'].apply(lambda x: x.replace(': ', '": "').replace("['", '{"').replace("']", '"}').replace("', '", '", "'))
print(df['transcript'].apply(lambda x: type(x)))
df['transcript'].apply(lambda x: json.loads(x))
输出

0    <class 'str'>
Name: transcript, dtype: object

0    {'Joe(joe@email.com)': 'I'm doing good', 'Smoe(smoe@email.com)': 'Hey!! How are you doing?'}
Name: transcript, dtype: object
0
姓名:转录本,数据类型:对象
0{'(joe@email.com)“:“我做得很好,”斯莫说(smoe@email.com)“:‘嘿!!你好吗?’
姓名:转录本,数据类型:对象

为了不丢失任何数据,您需要列表对象的真正格式是什么?它可以是一个格式正确的键:值对列表吗?

上拆分列表中的每个项,并用每个键创建字典,拆分后使用json.dumps将其序列化为json字符串

df.transcript.apply(lambda x:{key:value.strip()表示键,[item.split(':')中的值表示x]}).apply(json.dumps)
输出

“{”乔(joe@email.com)“:”我做得很好“,”斯莫(smoe@email.com)“:“嘿!!你好吗?”}”

上拆分列表中的每个项目:
并用每个键创建字典,在拆分后创建值,然后使用json.dumps将其序列化为json字符串

df.transcript.apply(lambda x:{key:value.strip()表示键,[item.split(':')中的值表示x]}).apply(json.dumps)
输出

“{”乔(joe@email.com)“:”我做得很好“,”斯莫(smoe@email.com)“:“嘿!!你好吗?”}”

显然,预期的数据帧包含无效的JSON。如果需要多个值,则需要使用数组而不是dict。例如,预期的JSON是:
['Joe](joe@email.com):嘿,斯莫(smoe@email.com):嘿!!你好吗?,“乔(joe@email.com):我做得很好]
啊。。。我懂了。这是有道理的。我没有该JSON对象的密钥显然,您预期的数据帧包含无效的JSON。如果需要多个值,则需要使用数组而不是dict。例如,预期的JSON是:
['Joe](joe@email.com):嘿,斯莫(smoe@email.com):嘿!!你好吗?,“乔(joe@email.com):我做得很好]
啊。。。我懂了。这是有道理的。我没有那个JSON对象的密钥