我有这样的字典:
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
给了我想要的输出。
但是,我想知道是否有更有效的解决方案!?
答案 0 :(得分: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 :(得分:4)
基于@qu-dong的想法并使用生成器函数来提高可读性:
#! /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毫秒。因此,人们可以继续进一步研究,以便在喂养较大的文本时不会受到影响; - )