and*_*rix 6 python series python-2.7 pandas
我有一个熊猫系列,其中的值在几个不同的用户之间有所不同。我想要做的是从每个用户那里随机抽取一个样本,并返回随机样本的索引值。
该系列看起来像这样(每个用户出现在多行中):
index
row1 user1
row2 user2
row3 user2
row4 user1
row5 user2
row6 user1
row7 user3
...
Run Code Online (Sandbox Code Playgroud)
我写的函数是这样的:
def get_random_sample(series, sample_size, users):
""" Grab a random sample of size sample_size of the tickets resolved by each user in the list users.
Series has the ticket number as index, and the username as the series values.
Returns a dict {user:[sample_tickets]}
"""
sample_dict = {}
for user in users:
sample_dict[user] = series[series==user].sample(n=sample_size, replace=False)
return sample_dict
Run Code Online (Sandbox Code Playgroud)
返回的内容如下:
# assuming sample_size is 4
{user1: [user1, user1, user1, user1],
user2: [user2, user2, user2, user2],
...}
Run Code Online (Sandbox Code Playgroud)
但我想为我的输出得到的是:
{user1: [row1, row6, row32, row40],
user2: [row3, row5, row17, row39],
...}
# where row# is the index label for the corresponding row.
Run Code Online (Sandbox Code Playgroud)
基本上我想让 pandas series.sample() 返回随机样本项目的索引而不是项目值。不确定这是否可行,或者我是否最好先重构我的数据(也许将用户作为数据帧中的系列名称,而索引成为该系列下的值?不知道该怎么做)。任何见解表示赞赏。
小智 6
正如@user48956 对接受的答案的评论,使用numpy.random.choice对索引进行采样要快得多
np.random.seed(42)
df = pd.DataFrame(np.random.randint(0,100,size=(10000000, 4)), columns=list('ABCD'))
%time df.sample(100000).index
print(_)
%time pd.Index(np.random.choice(df.index, 100000))
Run Code Online (Sandbox Code Playgroud)
Wall time: 710 ms
Int64Index([7141956, 9256789, 1919656, 2407372, 9181191, 2474961, 2345700,
4394530, 8864037, 6096638,
...
471501, 3616956, 9397742, 6896140, 670892, 9546169, 4146996,
3465455, 7748682, 5271367],
dtype='int64', length=100000)
Wall time: 6.05 ms
Int64Index([7141956, 9256789, 1919656, 2407372, 9181191, 2474961, 2345700,
4394530, 8864037, 6096638,
...
471501, 3616956, 9397742, 6896140, 670892, 9546169, 4146996,
3465455, 7748682, 5271367],
dtype='int64', length=100000)
Run Code Online (Sandbox Code Playgroud)
让我们尝试使用.indexafter example 返回这些样本的索引:
sample_dict[user] = series[series==user].sample(n=sample_size, replace=False).index
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5048 次 |
| 最近记录: |