我有一个这样的数据框:
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
任何帮助将不胜感激:)
答案 0 :(得分:1)
始终尝试构建数据,可以轻松完成,如下所示:
element.second
答案 1 :(得分:0)
使用apply
和pd.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.ordernum
。 replace
的{{1}}为0,而np.nan
的dropna = True则忽略0个值。 stack
获取所有列。
接下来,使用reset_index
和ordernum_index
创建列groupby
。
最后,将列名称更改为适当的名称。
cumcount