将pandas DataFrame分组一列,然后获取其他列中这些类别中出现的值列表

时间:2018-06-14 13:27:32

标签: python-3.x pandas

我正在寻找通过一个(或多个)列对DataFrame进行分组的可能性,而不是将另一个列添加到分组的DataFrame中,这样就可以从原始DataFrame中的另一列中获得此类别中出现的值。 (通过以下示例,我可能更容易理解我想做什么。)

例如,我有一个DataFrame,其中包含一些汽车的颜色和位置信息。我想知道每种颜色的汽车有多少(为此我使用groupby,但我愿意接受其他建议),但我还希望获得这些汽车所在的城市列表。

import pandas as pd

df = pd.DataFrame({'cars': ['A','B','C', 'D', 'E'], 'color':['blue','red', 'blue', 'red', 'blue'], 'city':['X', 'Y', 'X', 'Z', 'Z']})

df =
  cars city color
0    A    X  blue
1    B    Y   red
2    C    X  blue
3    D    Z   red
4    E    Z  blue

new_df = df.groupby(['color']).size().reset_index().rename(columns={0:'nr_of_cars'})

new_df = 
  color  nr_of_cars
0  blue           3
1   red           2

所以在my_df我有每种颜色的汽车数量,但我也想知道汽车所在的城市。一个新的DataFrame最终会是这样的(我不需要那些城市在同一个DataFrame中,我只需要轻松地加入它们:

  color  nr_of_cars     cities
0  blue           3      X, Z
1   red           2      Y, Z

我所知道的是我可以为每种颜色进行条件选择。

other_df = df[df['color'] == 'blue']['city'].unique()

但有没有办法让我不必遍历一系列颜色?我真正的DataFrame有点大,所以我很乐意收到一些建议。

编辑:修复错误。

1 个答案:

答案 0 :(得分:2)

IIUC:

In [90]: df.groupby('color').agg({'cars':'size','city':'unique'}).reset_index()
Out[90]:
  color  cars    city
0  blue     3  [X, Z]
1   red     2  [Y, Z]

@Dillon,

如果您想查看所有可用的聚合方法(函数)和属性,请尝试使用ipythonJupyter,如下所示:

首先创建一个" GroupBy"对象:

In [91]: g = df.groupby('color')

然后输入g.并按<Tab>键:

In [92]: g.
    g.agg        g.apply      g.cars       g.corrwith   g.cummax     g.describe   g.ffill      g.get_group  g.idxmax     g.mad        g.min
    g.aggregate  g.backfill   g.city       g.count      g.cummin     g.diff       g.fillna     g.groups     g.idxmin     g.max        g.ndim
    g.all        g.bfill      g.color      g.cov        g.cumprod    g.dtypes     g.filter     g.head       g.indices    g.mean       g.ngroup     >
    g.any        g.boxplot    g.corr       g.cumcount   g.cumsum     g.expanding  g.first      g.hist       g.last       g.median     g.ngroup