使用字典列将行添加到pandas数据框

时间:2019-05-26 19:24:22

标签: pandas dictionary

我有一个这样的数据框:

matrix = [(222, {'a': 1, 'b':3, 'c':2, 'd':1}),
         (333, {'a': 1, 'b':0, 'c':0, 'd':1})]

df = pd.DataFrame(matrix, columns=['ordernum', 'dict_of item_counts'])
   ordernum               dict_of item_counts
0       222  {'a': 1, 'b': 3, 'c': 2, 'd': 1}
1       333  {'a': 1, 'b': 0, 'c': 0, 'd': 1}

,我想创建一个数据帧,其中对ordernum中每个不为0的字典关键字重复每个dict_of_item_counts。我还想创建一个key列,显示该行对应的字典键以及包含字典值的value列。最后,我还将创建一个ordernum_index,它为每个ordernum计算数据帧中的不同行。

最终数据框应如下所示:

ordernum      ordernum_index      key     value

222           1                   a       1
222           2                   b       3 
222           3                   c       2
222           4                   d       1
333           1                   a       1
333           2                   d       1 

任何帮助将不胜感激:)

4 个答案:

答案 0 :(得分:1)

始终尝试构建数据,可以轻松完成,如下所示:

element.second

答案 1 :(得分:0)

使用applypd.Series来扩展字典,并使用concat将其连接到另一列(ordernum)。请参见下面的df2中间结果。 现在将每一列变成一行,使用melt,然后使用query删除所有0行,最后使用assign cumcount来获取索引(在排序之后),然后加1以从1开始计数,而不是0。

df2 = pd.concat([df[['ordernum']], df['dict_of item_counts'].apply(pd.Series)], axis=1)
(df2.melt(id_vars='ordernum', var_name='key')
.query('value != 0')
.sort_values(['ordernum', 'key'])
.assign(ordernum_index = lambda df: df.groupby('ordernum').cumcount().add(1)))
#   ordernum key  value  ordernum_index
#0       222   a      1               1
#2       222   b      3               2
#4       222   c      2               3
#6       222   d      1               4
#1       333   a      1               1
#7       333   d      1               2

现在df2看起来像:

#   ordernum  a  b  c  d
#0       222  1  3  2  1
#1       333  1  0  0  1

答案 2 :(得分:0)

您可以通过以下方式做到这一点:解开字典,同时使用iterrows访问字典,并根据ordernum, key, value创建一个元组。

最后要创建您的ordernum_index,我们在ordernum上进行分组,并执行cumcount

data = [(r['ordernum'], k, v) for _, r in df.iterrows() for k, v in r['dict_of item_counts'].items() ]

new = pd.DataFrame(data, columns=['ordernum', 'key', 'value']).sort_values('ordernum').reset_index(drop=True)

new['ordernum_index'] = new[new['value'].ne(0)].groupby('ordernum').cumcount().add(1)
new.dropna(inplace=True)

   ordernum key  value  ordernum_index
0       222   a      1             1.0
1       222   b      3             2.0
2       222   c      2             3.0
3       222   d      1             4.0
4       333   a      1             1.0
7       333   d      1             2.0

答案 3 :(得分:0)

使用df1作为值和df['dict_of item_counts'].tolist()作为索引来构造数据帧df.ordernumreplace的{​​{1}}为0,而np.nan的dropna = True则忽略0个值。 stack获取所有列。

接下来,使用reset_indexordernum_index创建列groupby

最后,将列名称更改为适当的名称。

cumcount