[英]Reshaping a Python dict to a Pandas dataframe
我給了一個Python字典,看起來像:
myDict = {'A':['a','b','c','d','e'],
'B':['f','g','h']}
我想將其轉換為具有以下結構的Pandas數據框:
key val
0 B f
1 B g
2 B h
3 A a
4 A b
5 A c
6 A d
7 A e
我無法使用標准方法將字典輸入到Pandas數據框中,但是我想出了一種可行的方法,但看起來有些笨拙。 基本上,我創建了2個包含鍵和值的列表,將其轉換為另一個字典並將該字典導入到Pandas數據框中。 我確定我可以使用列表或字典理解來合並某些行,但是最終命令將不可讀。 我暫時將每行分開,以使閱讀代碼更容易。
myDict = {'A':['a','b','c','d','e'],
'B':['f','g','h']}
# Column of keys
keys = [[k]*len(v) for k,v in myDict.items()]
# Flatten list
keys = [item for sublist in keys for item in sublist]
# Column of values
values = [v for k,v in myDict.items()]
# Flatten list
values = [item for sublist in values for item in sublist]
key = 'key'
value = 'val'
df = pd.DataFrame({key:keys,value:values})
print(df)
也許我凝視了太久了,但是我的問題是是否有一個更簡單的內置命令來實現相同的目標。
您可以簡單地遍歷字典,然后依次遍歷每個列表:
df = pd.DataFrame(
data=[(k, v) for k, l in myDict.items() for v in l],
columns=['key', 'value']
)
您可以使用單線執行此操作:
pd.DataFrame.from_dict(myDict, orient='index')
.stack()
.reset_index()
.drop('level_1', axis=1)
.rename(columns={'level_0': 'key', 0: 'value'})
key value
0 A a
1 A b
2 A c
3 A d
4 A e
5 B f
6 B g
7 B h
使用取消嵌套
df=unnesting(pd.Series(myDict).to_frame(),[0]).reset_index()
df.columns=['key','value']
df
Out[402]:
key value
0 A a
1 A b
2 A c
3 A d
4 A e
5 B f
6 B g
7 B h
一個在大熊貓以外運行但稍微簡化了操作的選項:
my_dict = {'A':['a','b','c','d','e'],
'B':['f','g','h']}
my_vals=[list(zip(k*len(v), v)) for k,v in my_dict.items()]
my_rows=[item for sublist in my_vals for item in sublist ]
pd.DataFrame(my_rows, columns=['key','val'])
key val
0 A a
1 A b
2 A c
3 A d
4 A e
5 B f
6 B g
7 B h
您也可以嘗試使用:
import pandas as pd
myDict = {'A':['a','b','c','d','e'],
'B':['f','g','h']}
# Creating dataframe from the dictionary
df = pd.DataFrame.from_dict(myDict, orient='index')
# Transpose to change keys to column names
# stack creates level by pivoting columns
# reset index and only select two columns
df = df.T.stack().reset_index().iloc[:,1:]
# renaming columns
df.columns = ['key', 'value']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.