Pandas数据帧来自列表值的字典

时间:2018-06-07 22:53:02

标签: python list pandas dictionary dataframe

我有一个包含列表的词典,例如:

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')

如何修改此功能以实现上述目标?

5 个答案:

答案 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.chainitertools.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 失败。有两种方法可以做到:

  1. from_dict(.. orient='columns')是我在this answer by root找到的一个无证件的伎俩; pd.DataFrame.from_dict(cols, orient='index').T添加NaN单元格以使结果成为矩形
  2. 手动替代方案是找到每行填充多少个单元格,如:

    使用transpose

  3. 计算打击垫数量

答案 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)并设置列名称获取预期的帧。