在Python中,如何按多键dict按一个键分组?

2024-05-16 14:17:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我这里有一个多键录音机。我试图通过dict按第一个键(a,B)分组,并将其转换为转置数据帧,然后将其写入csv文件

>>> dic= { ('A',1): 4, ('A',1):2, ('B', 1): 2, ('A', 2): 5, ('B', 2):3}
>>> dic
{('A', 1): 2, ('B', 1): 2, ('A', 2): 5, ('B', 2): 3}
>>> df = pd.DataFrame(dic.items()).groupby(0).sum()
>>> df
        1
0
(A, 1)  2
(A, 2)  5
(B, 1)  2
(B, 2)  3

以下是我到目前为止一直在做的事情:

>>> df = pd.DataFrame(dic.items()).groupby(0).sum()
>>> df
        1
0
(A, 1)  4
(A, 2)  5
(B, 1)  2
(B, 2)  3

>>> df_t = df.T
0  (A, 1)  (A, 2)  (B, 1)  (B, 2)
1       4       5       2       3
>>> df_t.to_csv(./file.csv)

我希望得到的是这样的东西:

    1     2
A   6     5
B   2     3  


Tags: 文件csvto数据dataframedfitems事情
1条回答
网友
1楼 · 发布于 2024-05-16 14:17:08

首先,字典从不包含重复的键(即字典可以保存1个键到N个值,但不能保存N个键到1个值)。在当前场景中,您的dic包含重复的键,因此在执行时将只接受最新的值。如果dic包含重复的键,可能的解决方案是将值放入列表中。差不多

dic = { ('A',1): 4, ('A',1):2, ('B', 1): 2, ('A', 2): 5, ('B', 2):3}

应该是,

dic = {('A',1):[4,2], ('B', 1): [2], ('A', 2): [5], ('B', 2):[3]}

现在解决方案部分

import pandas as pd

#data
dic = {('A',1):[4,2], ('B', 1): [2], ('A', 2): [5], ('B', 2):[3]}

#Converting dic to dataframe object
df = pd.DataFrame(dic.items())

#Explode will convert list of values to row like structure 
exp = df[1].explode().to_frame().reset_index()

#Merging df and exp to combine results
df = df.reset_index().merge(exp, on = 'index', how = 'left')

#Converting tuple of keys into separate columns
df[['i1','i2']] = df[0].apply(pd.Series)

#Summing up the result and then pivoting them to get desired result
df.groupby(['i1','i2'])['1_y'].sum().reset_index().pivot(index=['i1'],columns=['i2'],values=['1_y'])

#Renaming columns and index
res.columns = ['1','2']
res.index.names = ['']
res

输出:

      1 2
    
A     6 5
B     2 3

相关问题 更多 >