熊猫数据框到JSONL(JSON行)的转换

时间:2018-08-09 20:19:06

标签: python pandas jsonlines

我需要将熊猫数据框转换为JSONL格式。我找不到一个好的程序包来尝试实现自己,但是它看起来有点难看且效率不高。

例如,给定一个熊猫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

到目前为止,我已成功将“模式”转换为列表:

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(orient ='records')

[{'label': 'DRUG', 'pattern': ['aspirin']},
 {'label': 'DRUG', 'pattern': ['trazodone']},
 {'label': 'DRUG', 'pattern': ['citalopram']}]

UPD 2

最终,我设法以最非Python的方式获得了想要的东西。

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'}]}'

有什么机会可以显示出一种巧妙的解决方案吗?

1 个答案:

答案 0 :(得分:1)

在Pandas版本> <large-widget v-if="someState === 'one'"></large-widget> <small-widget v-else-if="someState === 'two'"></small-widget> <div v-else>WIDGET IS BORKEN</div> 中,DataFrame.to_json有一个参数0.19.0,它将写出JSONL格式。

鉴于此,您的解决方案的版本可能更简洁:

lines

输出:

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))