我有一个包含列表的词典,例如:
cols = {'animals':['dog','cat','fish'],
'colors':['red','black','blue','dog']}
我想将其转换为数据框,其中每个列表都根据其键进行枚举,结果为
key variable
animals dog
animals cat
animal fish
colors red
colors black
colors blue
colors dog
到目前为止,我已经做到了这一点:但它并没有为我提供理想的结果。
cols_df = pd.DataFrame.from_dict(cols, orient='index')
如何修改此功能以实现上述目标?
答案 0 :(得分:2)
这可能不是最快的解决方案,您需要其他列表。
d = {'animals': ['dog','cat','fish'],
'colors': ['red','black','blue','dog']}
keys = [k for k in d.keys() for v in d[k]]
values = [v for k in d.keys() for v in d[k]]
pd.DataFrame.from_dict({'index': keys, 'values': values})
答案 1 :(得分:1)
没有导入,适用于所有输入:
>>> pd.DataFrame([(key, var) for (key, L) in cols.items() for var in L],
columns=['key', 'variable'])
key variable
0 animals dog
1 animals cat
2 animals fish
3 colors red
4 colors black
5 colors blue
6 colors dog
答案 2 :(得分:0)
使用itertools.chain
和itertools.repeat
:
import pandas as pd
from itertools import chain, repeat
chainer = chain.from_iterable
d = {'animals': ['dog', 'cat', 'fish'],
'colors': ['red', 'black', 'blue', 'dog']}
df = pd.DataFrame({'key': list(chainer(repeat(k, len(v)) for k, v in d.items())),
'variable': list(chainer(d.values()))})
print(df)
key variable
0 animals dog
1 animals cat
2 animals fish
3 colors red
4 colors black
5 colors blue
6 colors dog
答案 3 :(得分:0)
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "export INDEX=${HOSTNAME##*-}"]
我们首先需要将cols填充到相同的长度以防止pd.DataFrame.from_dict(cols, orient='index').T.unstack().dropna().reset_index(level=1,drop=True)
animals dog
animals cat
animals fish
colors red
colors black
colors blue
colors dog
失败。有两种方法可以做到:
from_dict(.. orient='columns')
是我在this answer by root找到的一个无证件的伎俩; pd.DataFrame.from_dict(cols, orient='index').T
添加NaN单元格以使结果成为矩形手动替代方案是找到每行填充多少个单元格,如:
使用transpose
答案 4 :(得分:0)
您可以使用stack
:
df = pd.DataFrame.from_dict(cols, orient='index')
df = df.stack().to_frame().reset_index().drop('level_1', axis=1)
df.columns = ['key', 'variable']
df
key variable
0 colors red
1 colors black
2 colors blue
3 colors dog
4 animals dog
5 animals cat
6 animals fish
<强>样本:强>
df = pd.DataFrame.from_dict(cols, orient='index')
df
0 1 2 3
colors red black blue dog
animals dog cat fish None
df.stack()
返回一个系列。需要使用to_frame()
将其转换为数据框。之后完成reset_index()
以获得所需的帧。
df.stack().to_frame().reset_index()
level_0 level_1 0
0 colors 0 red
1 colors 1 black
2 colors 2 blue
3 colors 3 dog
4 animals 0 dog
5 animals 1 cat
6 animals 2 fish
现在drop('level_1', axis=1)
并设置列名称获取预期的帧。