我使用python-pandas数据帧,我有一个包含用户及其数据的大型数据帧。每个用户可以有多行。我想为每个用户采样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])
df1
>> B C D E User
0 B C D E user1
1 B1 C1 D1 E1 user1
2 B2 C2 D2 E2 user2
3 B3 C3 D3 E3 user3
4 B4 C4 D4 E4 user2
5 B5 C5 D5 E5 user3
userList = list(df1.User.unique())
userList
> ['user1', 'user2', 'user3']
I循环遍历唯一用户列表并为每个用户采样一行,将它们保存到不同的数据帧
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
有没有更有效的方法来实现这一目标?我真的很想: 1)避免追加到dataframe usersSample。这是逐渐成长的对象,它严重影响了性能。 并且2)避免一次一个地循环用户。有没有办法更有效地对每个用户进行一次采样?
答案 0 :(得分:17)
这就是你想要的:
df1.groupby('User').apply(lambda df: df.sample(1))
没有额外的索引:
df1.groupby('User', group_keys=False).apply(lambda df: df.sample(1))
答案 1 :(得分:3)
根据每个用户的行数,这可能会更快:
df.sample(frac=1).drop_duplicates(['User'])
答案 2 :(得分:0)
df1_user_sample_one = df1.groupby('User').apply(lambda x:x.sample(1))
使用DataFrame.groupby.apply和lambda函数来样本1
答案 3 :(得分:0)
.drop_duplicates
应该可以正常工作:
df1.drop_duplicates(subset='User')
这会将每个首次出现的值保留在“用户”列中,并返回相应的行。