python 将 Dataframe 转换为具有重复键的dict值

gkn4icbw  于 2023-02-02  发布在  Python
关注(0)|答案(2)|浏览(182)

我有一个像这样的数据框

col1   col2    col3  col4   action_id
0   1      2        2     0       a, apple
1   1      2        3     5       b, apple
2   0.2   0.3       8     1       c, apple
3   0.2   0.02      1     2       a, apple
4   11     11       22    11      b, apple

我想把这个 Dataframe 转换成dict,把action_id作为键,把others作为值。
我希望我的输出是这样的:

{(1, 'a', 'apple'): array([[1, 2, 2, 0]]),
(1, 'b', 'apple'): array([[1, 2, 3, 5]]),
(1, 'c', 'apple'): array([[0.2, 0.3, 8, 1]]),
(2, 'a', 'apple'): array([[0.2, 0.02, 1, 2]]),
(2, 'b', 'apple'): array([[11, 11, 22, 11]])}

我试过这个方法
data2d = var.set_index('action_id').T.to_dict('list')var视为我的 Dataframe 。
但是这个方法用重复的键覆盖了dict中的值,并且只返回了重复键的最后一个值。有没有什么方法可以让重复的键也有不同的值?

{('c', 'apple'): array([[0.2, 0.3, 8, 1]]),
('a', 'apple'): array([[0.2, 0.02, 1, 2]]),
('b', 'apple'): array([[11, 11, 22, 11]])}
    • 编辑**

我做了一点小改动,在action_id中添加了1个元素,现在我的框架看起来像这样:

col1   col2    col3  col4   action_id
0   1      2        2     0       1, a, apple
1   1      2        3     5       1, b, apple
2   0.2   0.3       8     1       1, c, apple
3   0.2   0.02      1     2       2, a, apple
4   11     11       22    11      2, b, apple

但尽管如此,我还是得到了同样的问题,因为只有我的最后一个值来了

{(1, 'c', 'apple'): array([[0.2, 0.3, 8, 1]]),
(2, 'a', 'apple'): array([[0.2, 0.02, 1, 2]]),
(2, 'b', 'apple'): array([[11, 11, 22, 11]])}
qncylg1j

qncylg1j1#

在python字典中不可能有重复的键。
如果需要,可以在列表/数组级别进行聚合:

var.set_index('action_id').groupby(level=0).agg(list).T.to_dict('list')

输出:

{('a', 'apple'): [[1.0, 0.2], [2.0, 0.02], [2, 1], [0, 2]],
 ('b', 'apple'): [[1.0, 11.0], [2.0, 11.0], [3, 22], [5, 11]],
 ('c', 'apple'): [[0.2], [0.3], [8], [1]]}

或者:

var.set_index('action_id').groupby(level=0).apply(lambda g: g.to_numpy()).to_dict()

输出:

{('a', 'apple'): array([[1.  , 2.  , 2.  , 0.  ],
                        [0.2 , 0.02, 1.  , 2.  ]]),
 ('b', 'apple'): array([[ 1.,  2.,  3.,  5.],
                        [11., 11., 22., 11.]]),
 ('c', 'apple'): array([[0.2, 0.3, 8. , 1. ]])}
ovfsdjhp

ovfsdjhp2#

k=df1.action_id.str.split(",").map(tuple)
v=df1.loc[:,:'col4'].apply(lambda ss:ss.to_numpy(),axis=1)
dict(zip(k,v))
    
 out:
    
{('a', ' apple'): array([0.2 , 0.02, 1.  , 2.  ]),
 ('b', ' apple'): array([11., 11., 22., 11.]),
 ('c', ' apple'): array([0.2, 0.3, 8. , 1. ])}

相关问题