我正在尝试大熊猫的群体特征,特别是
gb = df.groupby('model')
gb.hist()
Run Code Online (Sandbox Code Playgroud)
由于gb有50个组,结果很混乱,我想只探索前5组的结果.
我找到了如何选择单个组groups或get_group(如何按键访问pandas groupby dataframe),而不是如何直接选择多个组.我能做的最好的事情是:
groups = dict(list(gb))
subgroup = pd.concat(groups.values()[:4])
subgroup.groupby('model').hist()
Run Code Online (Sandbox Code Playgroud)
有更直接的方式吗?
首先过滤你的df然后执行groupby会更容易:
In [155]:
df = pd.DataFrame({'model':np.random.randint(1,10,100), 'value':np.random.randn(100)})
first_five = df['model'].sort(inplace=False).unique()[:5]
gp = df[df['model'].isin(first_five)].groupby('model')
gp.first()
Out[155]:
value
model
1 -0.505677
2 1.217027
3 -0.641583
4 0.778104
5 -1.037858
Run Code Online (Sandbox Code Playgroud)
你可以做点什么
new_gb = pandas.concat( [ gb.get_group(group) for i,group in enumerate( gb.groups) if i < 5 ] ).groupby('model')
new_gb.hist()
Run Code Online (Sandbox Code Playgroud)
虽然,我会采用不同的方法.您可以使用该collections.Counter对象快速获取组:
import collections
df = pandas.DataFrame.from_dict({'model': pandas.np.random.randint(0, 3, 10), 'param1': pandas.np.random.random(10), 'param2':pandas.np.random.random(10)})
# model param1 param2
#0 2 0.252379 0.985290
#1 1 0.059338 0.225166
#2 0 0.187259 0.808899
#3 2 0.773946 0.696001
#4 1 0.680231 0.271874
#5 2 0.054969 0.328743
#6 0 0.734828 0.273234
#7 0 0.776684 0.661741
#8 2 0.098836 0.013047
#9 1 0.228801 0.827378
model_groups = collections.Counter(df.model)
print(model_groups) #Counter({2: 4, 0: 3, 1: 3})
Run Code Online (Sandbox Code Playgroud)
现在,您可以Counter像字典一样迭代对象,并查询所需的组:
new_df = pandas.concat( [df.query('model==%d'%key) for key,val in model_groups.items() if val < 4 ] ) # for example, but you can select the models however you like
# model param1 param2
#2 0 0.187259 0.808899
#6 0 0.734828 0.273234
#7 0 0.776684 0.661741
#1 1 0.059338 0.225166
#4 1 0.680231 0.271874
#9 1 0.228801 0.827378
Run Code Online (Sandbox Code Playgroud)
现在您可以使用内置pandas.DataFrame.groupby函数
gb = new_df.groupby('model')
gb.hist()
Run Code Online (Sandbox Code Playgroud)
由于model_groups包含所有组,您可以根据需要选择它.
如果您的model列包含字符串值(名称或其他内容)而不是整数,则它们都将工作相同 - 只需将查询参数更改'model==%d'%key为'model=="%s"'%key.
| 归档时间: |
|
| 查看次数: |
14592 次 |
| 最近记录: |