熊猫可以为groupby使用列表吗?

时间:2019-12-19 02:30:25

标签: python pandas pandas-groupby

import pandas as pd
import numpy as np

rng = np.random.RandomState(0)
df = pd.DataFrame({'key':['A', 'B', 'C', 'A', 'B', 'C'],
                   'data1': range(6),
                   'data2': rng.randint(0, 10, 6)}, 
                  columns=['key', 'data1', 'data2'])
df

   key data1 data2
0   A   0   5
1   B   1   0
2   C   2   3
3   A   3   3
4   B   4   7
5   C   5   9


L = [0, 1, 0, 1, 2, 0]
print(df.groupby(L).sum())

输出为:

  data1 data2
0   7   17
1   4   3
2   4   7

我需要清楚的解释吗?! L中的0、1和2是什么?它们是key的{​​{1}}列吗?还是它们的索引标签为df?以及如何根据df进行分组分组?

3 个答案:

答案 0 :(得分:2)

L是您的示例中的整数列表。当您对L进行分组时,您只是在说:查看此整数列表,然后根据这些唯一的整数对我的df进行分组。

我认为可视化是有道理的(请注意,df中没有L列-我只是为了可视化而添加了):

enter image description here

groupby L表示-取唯一值(在这种情况下为0,1和2),并对data1和data2求和。因此,当L = 0时data1的结果将是data1:0 + 2 + 5 = 7(以此类推)

enter image description here

,最终结果将是:

df.groupby(L).sum()

    data1   data2
0   7       17
1   4       3
2   4       7

答案 1 :(得分:2)

您可以使用列表对dataframe中的观察值进行分组。例如,假设您有几个人的身高:

import pandas as pd

df = pd.DataFrame({'names':['John', 'Mark', 'Fred', 'Julia', 'Mary'],
                   'height':[180, 180, 180, 160, 160]})

print(df)
   names  height
0   John     180
1   Mark     180
2   Fred     180
3  Julia     160
4   Mary     160

在其他地方,您收到了他们分配的组:

sex = ['man', 'man', 'man', 'woman', 'woman']

您无需将新列连接到dataframe即可,只需将它们分组即可。您可以使用列表来完成工作:

df.groupby(sex).mean()
       height
man       180
woman     160

答案 2 :(得分:0)

您可以在此处查看其工作方式:

In [6006]: df.groupby(L).agg(list)                                                                                                                                                             
Out[6006]: 
         key      data1      data2
0  [A, C, C]  [0, 2, 5]  [5, 3, 9]
1     [B, A]     [1, 3]     [0, 3]
2        [B]        [4]        [7]
In [6002]: list(df.groupby(L))                                                                                                                                                                 
Out[6002]: 
[(0,   key  data1  data2
  0   A      0      5
  2   C      2      3
  5   C      5      9), 
(1,   key  data1  data2
  1   B      1      0
  3   A      3      3), 
(2,   key  data1  data2
  4   B      4      7)]

在L中,它将“ 0”键(即ACC),索引0,2m5分组为1密钥是BA,索引1,3,而两个键是“ B”,索引4。

这是由于L键的对齐:

df['L'] = L

  key  data1  data2  L
0   A      0      5  0
1   B      1      0  1
2   C      2      3  0
3   A      3      3  1
4   B      4      7  2
5   C      5      9  0

我希望这是有道理的