Python Pandas 从 Groupby 中选择随机组样本
Posted
技术标签:
【中文标题】Python Pandas 从 Groupby 中选择随机组样本【英文标题】:Python Pandas Choosing Random Sample of Groups from Groupby 【发布时间】:2015-11-27 05:18:08 【问题描述】:获取groupby
元素的随机样本的最佳方法是什么?据我了解,groupby
只是一个可迭代的组。
如果我想选择N = 200
元素,我会为可迭代执行此操作的标准方法是:
rand = random.sample(data, N)
如果您尝试上述数据是“分组”的,则结果列表的元素由于某种原因是元组。
我发现以下示例用于随机选择单个键 groupby
的元素,但这不适用于多键 groupby
。来自How to access pandas groupby dataframe by key
创建分组对象
grouped = df.groupby('some_key')
挑选 N 个数据帧并获取它们的索引
sampled_df_i = random.sample(grouped.indices, N)
使用 groupby 对象 'get_group' 方法获取组
df_list = map(lambda df_i: grouped.get_group(df_i),sampled_df_i)
可选 - 将其全部转回单个数据框对象
sampled_df = pd.concat(df_list, axis=0, join='outer')
【问题讨论】:
【参考方案1】:您可以对df.some_key.unique()
的唯一值进行随机抽样,使用它对df
进行切片,最后在结果上对groupby
进行切片:
In [337]:
df = pd.DataFrame('some_key': [0,1,2,3,0,1,2,3,0,1,2,3],
'val': [1,2,3,4,1,5,1,5,1,6,7,8])
In [338]:
print df[df.some_key.isin(random.sample(df.some_key.unique(),2))].groupby('some_key').mean()
val
some_key
0 1.000000
2 3.666667
如果有多个 groupby 键:
In [358]:
df = pd.DataFrame('some_key1':[0,1,2,3,0,1,2,3,0,1,2,3],
'some_key2':[0,0,0,0,1,1,1,1,2,2,2,2],
'val': [1,2,3,4,1,5,1,5,1,6,7,8])
In [359]:
gby = df.groupby(['some_key1', 'some_key2'])
In [360]:
print gby.mean().ix[random.sample(gby.indices.keys(),2)]
val
some_key1 some_key2
1 1 5
3 2 8
但是如果你只是要获取每个组的值,你甚至不需要groubpy
,MultiIndex
就可以了:
In [372]:
idx = random.sample(set(pd.MultiIndex.from_product((df.some_key1, df.some_key2)).tolist()),
2)
print df.set_index(['some_key1', 'some_key2']).ix[idx]
val
some_key1 some_key2
2 0 3
3 1 5
【讨论】:
非常彻底。感谢您提供多索引示例。 如何从每个组合中获取行的百分比【参考方案2】:我觉得较低级别的numpy
操作更干净:
import pandas as pd
import numpy as np
df = pd.DataFrame(
"some_key": [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3],
"val": [1, 2, 3, 4, 1, 5, 1, 5, 1, 6, 7, 8],
)
ids = df["some_key"].unique()
ids = np.random.choice(ids, size=2, replace=False)
ids
# > array([3, 2])
df.loc[df["some_key"].isin(ids)]
# > some_key val
# 2 2 3
# 3 3 4
# 6 2 1
# 7 3 5
# 10 2 7
# 11 3 8
【讨论】:
以上是关于Python Pandas 从 Groupby 中选择随机组样本的主要内容,如果未能解决你的问题,请参考以下文章
python pandas groupby分组后的数据怎么用
使用 selection & groupby (python) 维护 pandas df 索引