我有一個如下所示的資料框:
key text
0 title Lorem ipsum
1 header Lorem ipsum
2 description Lorem ipsum
.
.
.
.
10 pyramid.male Lorem ipsum
11 pyramid.male_surplus Lorem ipsum
12 pyramid.female Lorem ipsum
13 pyramid.female_surplus Lorem ipsum
.
.
.
.
29 jitterplot.title1 Lorem ipsum
30 jitterplot.metric_1.label Lorem ipsum
31 jitterplot.metric_1.tooltip Lorem ipsum
32 jitterplot.metric_2.label Lorem ipsum
33 jitterplot.metric_2.tooltip Lorem ipsum
鍵表示 JSON 檔案中的鍵。JSON 結構應如下所示:
{
"title": "Lorem ipsum",
"header": "Lorem ipsum",
"description": "Lorem ipsum",
"pyramid": {
"male": "Lorem ipsum",
"male_surplus": "Lorem ipsum",
"female": "Lorem ipsum",
"female_surplus": "Lorem ipsum"
},
"jitterplot": {
"title1": "Lorem ipsum",
"metric_1": {
"label": "Lorem ipsum",
"tooltip": "Lorem ipsum"
},
"metric_2": {
"label": "Lorem ipsum",
"tooltip": "Lorem ipsum"
}
}
}
意思是.,key列中的 a 表示嵌套級別。
有沒有一種“Pythonic”的方式來實作這一點?目前,我只是通過使用我撰寫的自定義決議器將每一行手動寫入文本檔案來破解它。但顯然這不是非常可擴展的。
我準備了一個您可以閱讀的示例 CSV,并添加了一些額外的列,如果它們有幫助的話。使用以下代碼:
import pandas as pd
url = 'https://raw.githubusercontent.com/Thevesh/Display/master/i18n_sample.csv'
df = pd.read_csv(url)
df['n_levels'] = df['key'].str.count('\.') # column with number of levels
max_levels = df.n_levels.max() #
df = df.join(df['key'].str.split('.',expand=True))
df.columns = list(df.columns)[:-max_levels-1] ['key_' str(x) for x in range(max_levels 1)]
uj5u.com熱心網友回復:
同樣,但比其他答案簡單一點:
def set_nested_value(d, keys, value):
for key in keys[:-1]:
d = d.setdefault(key, {})
d[keys[-1]] = value
result = {}
for _, row in df.iterrows():
set_nested_value(result, row["key"].split("."), row["text"])
uj5u.com熱心網友回復:
這似乎很適合遞回函式:
# Dataframe with columns key and value:
df = ...
json_data = {}
def set_value(nested_dict, keys, value):
if len(keys) == 1:
nested_dict[keys[0]] = value
return
if keys[0] not in nested_dict:
nested_dict[keys[0]] = {}
set_value(nested_dict[keys[0]], keys[1:], value)
for full_key, value in zip(df.key, df.text):
keys = full_key.split('.')
set_value(json_data, keys, value)
print(json_data)
uj5u.com熱心網友回復:
def autonesting_dict():
return collections.defaultdict(autonesting_dict)
json_dict = autonesting_dict()
key, value = 'jitterplot.metric_2.tooltip', "Lorem ipsum"
subkeys = key.split('.')
nested_dict = functools.reduce(lambda d, key: d[key], subkeys[:-1], json_dict)
nested_dict[subkeys[-1]] = value
以上將使它:
json_dict['jitterplot']['metric_2']['tooltip'] # 'Lorem ipsum'
只需對所有行重復。
旁注關于:
我準備了一個您可以閱讀的示例 CSV,并添加了一些額外的列,如果它們有幫助的話。使用以下代碼:
也許只有我一個人,但這聽起來像是在作業或測驗中給出的東西,而不是尋求幫助的人。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/487959.html
