我正在寻找通过一个(或多个)列对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有点大,所以我很乐意收到一些建议。
编辑:修复错误。
答案 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,
如果您想查看所有可用的聚合方法(函数)和属性,请尝试使用ipython
或Jupyter
,如下所示:
首先创建一个" 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