每个唯一值采样一条记录(熊猫、python)

我使用python数据帧,我有一个包含用户及其数据的大型数据帧。每个用户可以有多行。我想为每个用户取样1行。
我目前的解决方案似乎效率不高:

df1=pd.DataFrame({'User':['user1','user1','user2','user3','user2','user3'],
‘B’:[‘B’、‘B1’、‘B2’、‘B3’、‘B4’、‘B5’],
‘C’:[‘C’、‘C1’、‘C2’、‘C3’、‘C4’、‘C5’],
‘D’:[‘D’、‘D1’、‘D2’、‘D3’、‘D4’、‘D5’],
‘E’:[E’、‘E1’、‘E2’、‘E3’、‘E4’、‘E5’]},
索引=[0,1,2,3,4,5])
df1
&燃气轮机&燃气轮机;B C D E用户
0 B C D E用户1
1 B1 C1 D1 E1用户1
2 B2 C2 D2 E2用户2
3 B3 C3 D3 E3用户3
4 B4 C4 D4 E4用户2
5 B5 C5 D5 E5用户3
userList=list(df1.User.unique())
用户列表
&燃气轮机;['user1'、'user2'、'user3']

I循环遍历唯一用户列表,并为每个用户采样一行,将它们保存到不同的数据帧中

usersSample=pd.DataFrame()#空DataFrame,用于保存样本
对于用户列表中的i:
usersSample=usersSample.append(df1[df1.User==i].sample(1))
&燃气轮机;用户示例
B C D E用户
0 B C D E用户1
4 B4 C4 D4 E4用户2
3 B3 C3 D3 E3用户3

有没有更有效的方法来实现这一点?我真的很想:
1) 避免附加到dataframe usersSample。这是一个逐渐增长的对象,严重影响了性能。
2)避免一次只对一个用户进行循环。是否有一种方法可以更有效地对每个用户进行1次抽样

这就是你想要的:

df1.groupby('User').apply(lambda-df:df.sample(1))

没有额外的索引:

df1.groupby('User',group\u keys=False)。应用(lambda-df:df.sample(1))

发表评论