――Ich möchte ein verschachteltes Wörterbuch erweitern, indem ich es mit einem Unterstrich verbinde.
--Eingabe: d1 = {'A': {'i': 0, 'j': 1}, 'B': {'i': 2, 'j': 3}}
Daten, die als Wörterbuch verwendet werden können
d2 = {'A_i': 0, 'A_j': 1, 'B_i': 2, 'B_j': 3}
In einer Dimension geöffnet―― Am Ende hat das verschachtelte Wörterbuch eine Baumstruktur. ――Als Bild ist der Prozess wie das Brechen einer Baumstruktur und das direkte Verbinden der Wurzeln und Enden.
Also habe ich den folgenden Code geschrieben.
#Schlüsselwechsel
def changekey(dict,k1,k2):
dict[k2] = dict[k1]
del dict[k1]
#Fügen Sie allen Tasten mit Unterstrichen Modifikatoren hinzu
def addkeyheader(dict,key):
ks = list(dict.keys())
for k in ks:
changekey(dict,k,key+'_'+k)
#Lieblingsfunktion Kombinieren Sie nach der Suche nach Tiefenpriorität die Elementnamen und kehren Sie zurück
def dict_flatten(dict_,depth=2):
newdict = {}
for key in list(dict_.keys()):
#Wenn das Element auch diktiert ist, rufen Sie es rekursiv auf
if isinstance(dict_[key], dict):
if depth > 0:
dic = dict_flatten(dict_[key],depth-1)
addkeyheader(dic,key)
newdict.update(dic)
else:
newdict[key] = dict_[key]
#Wenn das Element nicht diktiert ist, lassen Sie es wie es ist
else:
newdict[key] = dict_[key]
return newdict
In den Kommentaren habe ich Ihnen von einer intelligenteren Implementierung erzählt.
def _unwrap(dct, prefix):
for key, value in dct.items():
new_key = f'{prefix}_{key}'
if isinstance(value, dict):
yield from _unwrap(value, new_key)
else:
yield new_key[1:], value
def unwrap(dct):
return dict(_unwrap(dct, ''))
d2 = unwrap(d1)
Wenn der Eingang konvertiert wird, sieht er wie folgt aus.
>> pd.DataFrame.from_dict(d1)
A B
i 0 2
j 1 3
Die Ausgabe wird wie folgt konvertiert.
>> pd.DataFrame(d2,index=[""])
A_i A_j B_i B_j
0 1 2 3
Ich fand es eine gute Idee, aber ich verstand Pandas nicht sehr gut.
Praktisch kann es mit der MultiIndex-Funktion bearbeitet werden, ohne es zerlegen zu müssen. https://qiita.com/Morinikiz/items/40faa91e7a83807c0552
>>> df = pd.DataFrame(d1)
>>> df
A B
i 0 2
j 1 3
>>> df.unstack()
A i 0
j 1
B i 2
j 3
dtype: int64
>>> df.stack()
i A 0
B 2
j A 1
B 3
dtype: int64
Verwenden Sie am Ende to_frame (), um zum Datenrahmen zurückzukehren.
>>> df.unstack().to_frame("name")
name
A i 0
j 1
B i 2
j 3
Recommended Posts