比较不同数据帧的groupby输出

时间:2017-07-18 08:29:34

标签: python pandas-groupby

有什么方法可以比较多个groupby输出。

我有来自不同数据帧的多个groupby输出,如下所示

>>> tmp1
  account place  balance type
0       A    A1       10   B1
1       A    A1       20   B1
2       A    A1       30   B1
3       A    A1       10   B4
4       A    A1       20   B4
5       A    A1       10   B5
6       A    A1       10   B6
7       B    A2       10   B7
8       B    A2       20   B1
9       B    A2      100   B1

我做

    >>>tmp1.groupby(['account','place','type']['balance'].last().sum(level=0).astype(int)
    account
    A        70
    B        110
    Name: balance, dtype: int64

Similarly
>>> tmp2
  account place  balance type
0       A    A1      100   B1
1       A    A1      200   B1
2       A    A1      100   B1
3       A    A1      100   B4
4       A    A1      200   B4
5       A    A1      100   B5
6       A    A1      100   B6
7       B    A2      100   B7
8       B    A2      200   B1
9       B    A2      200   B1


    >>>tmp2.groupby(['account','place','type']['balance'].last().sum(level=0).astype(int)
    account
    A        500
    B        300
    Name: balance, dtype: int64

    #similarly tmp3 grouped..and so on

有没有办法找到最大总和余额的df。例如。在这种情况下,tmp2具有更大的总和(70+110 < 500+300)

我的尝试: 我试过的方法之一是拿出总和并维护一个列表,如下面的

mylist=[]
mylist.append(tmp1.groupby(['account','place','type']['balance'].last().sum(.astype(int))
mylist.append(tmp2.groupby(['account','place','type']['balance'].last().sum(.astype(int))
>>> mylist
[180,800]

现在我可以从列表中获取最大值,但我丢失了帐户信息(800是最大但我需要有关帐户A的信息有500,B有300)

我试过

>>>tmp2.groupby(['account','place','type'])['balance'].last().sum(level=0).to_dict()
{'A': 500, 'B': 300}

所以对于我有dict的每一个df,我只需要找到最多这样的列表(我想我已经非常接近解决它了)

我打算找到哪个数据框有最大总和(以及帐户)

1 个答案:

答案 0 :(得分:1)

如果我理解正确,万一你有超过2个dfs。

tmp1 = pd.DataFrame([{'acount':'A', 'balance':100, 'type':'A1'},
               {'acount':'A', 'balance':200, 'type':'A2'},
              {'acount':'B', 'balance':200, 'type':'B1'},
               {'acount':'B', 'balance':300, 'type':'B2'}])
tmp2 = pd.DataFrame([{'acount':'A', 'balance':100, 'type':'A1'},
               {'acount':'A', 'balance':200, 'type':'A2'},
              {'acount':'B', 'balance':400, 'type':'B1'},
               {'acount':'B', 'balance':300, 'type':'B2'}])
tmplist = [tmp1,tmp2]
tmprlist = [tmp.groupby(['acount','type']).last().sum(level=0).astype(int) for tmp in tmplist]
tmpslist = [tmp.groupby(['acount','type'])['balance'].last().sum() for tmp in tmplist]
tmprlist[np.argmax(tmpslist)]

结果:

acount  balance
A       300
B       700