Pandas 数据帧到 JSONL(JSON 行)转换
Pandas dataframe to JSONL (JSON Lines) conversion
我需要将 pandas 数据框转换为 JSONL 格式。找不到好的包来做,自己尝试实现,但是看起来有点丑而且效率不高。
例如,给定一个 pandas df:
label pattern
0 DRUG aspirin
1 DRUG trazodone
2 DRUG citalopram
我需要转换为以下格式的 txt 文件:
{"label":"DRUG","pattern":[{"lower":"aspirin"}]}
{"label":"DRUG","pattern":[{"lower":"trazodone"}]}
{"label":"DRUG","pattern":[{"lower":"citalopram"}]}
我尝试使用 to_dict('records')
,但我缺少 [ ]
和嵌套的 'lower' 键。
df.to_dict('record')
创造:
[{'label': 'DRUG', 'pattern': 'aspirin'},
{'label': 'DRUG', 'pattern': 'trazodone'},
{'label': 'DRUG', 'pattern': 'citalopram'}]
我考虑过转换 'pattern' 列并包含嵌套的 'lower'?
UPD
至此,我成功将'pattern'转化为列表:
df_new = pd.concat((df[['label']], df[['pattern']].apply(lambda x: x.tolist(), axis=1)), axis=1)
df_new.columns = ['label', 'pattern']
df_new.head()
结果:
label pattern
0 DRUG [aspirin]
1 DRUG [trazodone]
2 DRUG [citalopram]
然后:
df_new.to_dict(方向='records')
[{'label': 'DRUG', 'pattern': ['aspirin']},
{'label': 'DRUG', 'pattern': ['trazodone']},
{'label': 'DRUG', 'pattern': ['citalopram']}]
UPD 2
最终,我设法得到了我想要的,但是是以最非 pythonic 的方式。
df_1 = pd.DataFrame(df[['pattern']].apply(lambda x: {'lower': x[0]}, axis=1))
df_1.columns = ['pattern']
df_fin = pd.concat((df[['label']], df_1[['pattern']].apply(lambda x: x.tolist(), axis=1)), axis=1)
df_fin.columns = ['label', 'pattern']
df_fin.to_json(orient='records')
'{'label': 'DRUG', 'pattern': [{'lower': 'aspirin'}]}
{'label': 'DRUG', 'pattern': [{'lower': 'trazodone'}]}
{'label': 'DRUG', 'pattern': [{'lower': 'citalopram'}]}'
你有机会展示一个巧妙的解决方案吗?
在 Pandas > 0.19.0
的版本中,DataFrame.to_json
有一个参数,lines
,它将输出 JSONL 格式。
鉴于此,您的解决方案的更简洁版本可能如下所示:
import pandas as pd
data = [{'label': 'DRUG', 'pattern': 'aspirin'},
{'label': 'DRUG', 'pattern': 'trazodone'},
{'label': 'DRUG', 'pattern': 'citalopram'}]
df = pd.DataFrame(data)
# Wrap pattern column in a dictionary
df["pattern"] = df.pattern.apply(lambda x: {"lower": x})
# Output in JSONL format
print(df.to_json(orient='records', lines=True))
输出:
{"label":"DRUG","pattern":{"lower":"aspirin"}}
{"label":"DRUG","pattern":{"lower":"trazodone"}}
{"label":"DRUG","pattern":{"lower":"citalopram"}}
为了写入文件,我修改了@kmsquire 的最后一行
# 以JSONL格式输出
import pandas as pd
data = [{'label': 'DRUG', 'pattern': 'aspirin'},
{'label': 'DRUG', 'pattern': 'trazodone'},
{'label': 'DRUG', 'pattern': 'citalopram'}]
df = pd.DataFrame(data)
# Wrap pattern column in a dictionary
df["pattern"] = df.pattern.apply(lambda x: {"lower": x})
# Output in JSONL format into a file
f=open('records.jsonl')
print(df.to_json(orient='records', lines=True),file=f, flush=False)
我需要将 pandas 数据框转换为 JSONL 格式。找不到好的包来做,自己尝试实现,但是看起来有点丑而且效率不高。
例如,给定一个 pandas df:
label pattern
0 DRUG aspirin
1 DRUG trazodone
2 DRUG citalopram
我需要转换为以下格式的 txt 文件:
{"label":"DRUG","pattern":[{"lower":"aspirin"}]}
{"label":"DRUG","pattern":[{"lower":"trazodone"}]}
{"label":"DRUG","pattern":[{"lower":"citalopram"}]}
我尝试使用 to_dict('records')
,但我缺少 [ ]
和嵌套的 'lower' 键。
df.to_dict('record')
创造:
[{'label': 'DRUG', 'pattern': 'aspirin'},
{'label': 'DRUG', 'pattern': 'trazodone'},
{'label': 'DRUG', 'pattern': 'citalopram'}]
我考虑过转换 'pattern' 列并包含嵌套的 'lower'?
UPD
至此,我成功将'pattern'转化为列表:
df_new = pd.concat((df[['label']], df[['pattern']].apply(lambda x: x.tolist(), axis=1)), axis=1)
df_new.columns = ['label', 'pattern']
df_new.head()
结果:
label pattern
0 DRUG [aspirin]
1 DRUG [trazodone]
2 DRUG [citalopram]
然后:
df_new.to_dict(方向='records')
[{'label': 'DRUG', 'pattern': ['aspirin']},
{'label': 'DRUG', 'pattern': ['trazodone']},
{'label': 'DRUG', 'pattern': ['citalopram']}]
UPD 2
最终,我设法得到了我想要的,但是是以最非 pythonic 的方式。
df_1 = pd.DataFrame(df[['pattern']].apply(lambda x: {'lower': x[0]}, axis=1))
df_1.columns = ['pattern']
df_fin = pd.concat((df[['label']], df_1[['pattern']].apply(lambda x: x.tolist(), axis=1)), axis=1)
df_fin.columns = ['label', 'pattern']
df_fin.to_json(orient='records')
'{'label': 'DRUG', 'pattern': [{'lower': 'aspirin'}]}
{'label': 'DRUG', 'pattern': [{'lower': 'trazodone'}]}
{'label': 'DRUG', 'pattern': [{'lower': 'citalopram'}]}'
你有机会展示一个巧妙的解决方案吗?
在 Pandas > 0.19.0
的版本中,DataFrame.to_json
有一个参数,lines
,它将输出 JSONL 格式。
鉴于此,您的解决方案的更简洁版本可能如下所示:
import pandas as pd
data = [{'label': 'DRUG', 'pattern': 'aspirin'},
{'label': 'DRUG', 'pattern': 'trazodone'},
{'label': 'DRUG', 'pattern': 'citalopram'}]
df = pd.DataFrame(data)
# Wrap pattern column in a dictionary
df["pattern"] = df.pattern.apply(lambda x: {"lower": x})
# Output in JSONL format
print(df.to_json(orient='records', lines=True))
输出:
{"label":"DRUG","pattern":{"lower":"aspirin"}}
{"label":"DRUG","pattern":{"lower":"trazodone"}}
{"label":"DRUG","pattern":{"lower":"citalopram"}}
为了写入文件,我修改了@kmsquire 的最后一行
# 以JSONL格式输出
import pandas as pd
data = [{'label': 'DRUG', 'pattern': 'aspirin'},
{'label': 'DRUG', 'pattern': 'trazodone'},
{'label': 'DRUG', 'pattern': 'citalopram'}]
df = pd.DataFrame(data)
# Wrap pattern column in a dictionary
df["pattern"] = df.pattern.apply(lambda x: {"lower": x})
# Output in JSONL format into a file
f=open('records.jsonl')
print(df.to_json(orient='records', lines=True),file=f, flush=False)