簡體   English   中英

將Python字典重塑為Pandas數據框

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM