2016-05-30 76 views
2

我有這樣一本字典:怎樣詞典的詞條有效地轉換成數據幀

mydict = {'A': 'some thing', 
      'B': 'couple of words'} 

所有值是由空格分隔的字符串。我的目標是將其轉換成數據幀,看起來像這樣:

key_val splitted_words 
0  A   some 
1  A   thing 
2  B   couple 
3  B    of 
4  B   words 

所以我要拆分的字符串,然後添加相應的鍵,這句話到數據幀的一行。

的快速實現看起來是這樣的:

import pandas as pd 

mydict = {'A': 'some thing', 
      'B': 'couple of words'} 

all_words = " ".join(mydict.values()).split() 
df = pd.DataFrame(columns=['key_val', 'splitted_words'], index=range(len(all_words))) 

indi = 0 
for item in mydict.items(): 
    words = item[1].split() 
    for word in words: 
     df.iloc[indi]['key_val'] = item[0] 
     df.iloc[indi]['splitted_words'] = word 
     indi += 1 

這給了我所需的輸出。

但是,我想知道是否有更高效的解決方案!

回答

4

這是我上線的方法:

df = pd.DataFrame([(k, s) for k, v in mydict.items() for s in v.split()], columns=['key_val','splitted_words']) 

如果我把它分解,這將是:

d=[(k, s) for k, v in mydict.items() for s in v.split()] 
df = pd.DataFrame(d, columns=['key_val','splitted_words']) 

輸出:基於@瞿棟的

Out[41]: 
    key_val splitted_words 
0  A   some 
1  A   thing 
2  B   couple 
3  B    of 
4  B   words 
+1

不錯,也許可以使用'.split()'而不是'.split('')' – jezrael

+0

@jezrael,謝謝你的建議!已編輯。 – 2342G456DI8

+0

非常棒!我現在喜歡並且稍後再接受,這取決於其他答案的質量。 – Cleb

4

想法和使用發電機功能的可讀性一個工作示例:

#! /usr/bin/env python 
from __future__ import print_function 
import pandas as pd 

mydict = {'A': 'some thing', 
      'B': 'couple of words'} 


def splitting_gen(in_dict): 
    """Generator function to split in_dict items on space.""" 
    for k, v in in_dict.items(): 
     for s in v.split(): 
      yield k, s 

df = pd.DataFrame(splitting_gen(mydict), columns=['key_val', 'splitted_words']) 
print (df) 

# key_val splitted_words 
# 0  A   some 
# 1  A   thing 
# 2  B   couple 
# 3  B    of 
# 4  B   words 

# real 0m0.463s 
# user 0m0.387s 
# sys  0m0.057s 

但是這隻能滿足要求的優雅/可讀性的效率。

如果你注意到它們的時間都是近似的。短暫超過500毫秒。所以人們可能會繼續進一步剖析,以便在吃大文本時不會受到影響;-)

+0

好的方法,謝謝(upvoted)。 – Cleb