pandas 每个唯一值采样一条记录

bvjveswy  于 2023-11-15  发布在  其他
关注(0)|答案(4)|浏览(108)

我有一个包含用户和他们的数据的大框架。每个用户可以有多行。我想每个用户采样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']},
                 index=[0, 1, 2, 3,4,5]

userList = list(df1.User.unique())

usersSample = pd.DataFrame() # empty dataframe, to save samples
for i in userList:
    usersSample=usersSample.append(df1[df1.User == i].sample(1)) 

> usersSample   
B   C   D   E   User
0   B   C   D   E   user1
4   B4  C4  D4  E4  user2
3   B3  C3  D3  E3  user3

字符串
有没有更有效的方法来实现这一点?

cyvaqqii

cyvaqqii1#

这就是你想要的:

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

字符串


的数据
没有额外的索引:

df1.groupby('User', group_keys=False).apply(lambda df: df.sample(1))


f0ofjuux

f0ofjuux2#

根据每个用户的行数,这可能更快:

df.sample(frac=1).drop_duplicates(['User'])

字符串

o75abkj4

o75abkj43#

df1_user_sample_one = df1.groupby('User').apply(lambda x:x.sample(1))

字符串
使用DataFrame.groupby.apply和lambda函数对sample1

kgqe7b3p

kgqe7b3p4#

.drop_duplicates应该可以正常工作:

df1.drop_duplicates(subset='User')

字符串
这将在列“User”中保留值的每个第一次出现,并返回相应的行。

相关问题