Pandas的非比例分层抽样

kpbwa7wx  于 2023-04-28  发布在  其他
关注(0)|答案(7)|浏览(104)

如何从以下数据框中的每组(列Name)中随机选择一行:

Distance   Name  Time  Order
1        16   John     5      0
4        31   John     9      1
0        23   Kate     3      0
3        15   Kate     7      1
2        32  Peter     2      0
5        26  Peter     4      1

预期结果:

Distance   Name  Time  Order

4        31   John     9      1
0        23   Kate     3      0
2        32  Peter     2      0
5jvtdoz2

5jvtdoz21#

您可以在Name列上使用groupby并应用sample

df.groupby('Name',as_index=False).apply(lambda x:x.sample()).reset_index(drop=True)
Distance   Name  Time  Order
0        31   John     9      1
1        15   Kate     7      1
2        32  Peter     2      0
zbsbpyhn

zbsbpyhn2#

例如,您可以使用numpy函数random.permutation对所有样本进行混洗。然后groupby乘以Name,并从每组中取N行:

df.iloc[np.random.permutation(len(df))].groupby('Name').head(1)
dfuffjeb

dfuffjeb3#

你可以使用unique来实现

df['Name'].unique()
xqnpmsa8

xqnpmsa84#

打乱 Dataframe :

df.sample(frac=1)

然后删除重复的行:

df.drop_duplicates(subset=['Name'])
wljmcqd8

wljmcqd85#

df.drop_duplicates(subset='Name')


   Distance   Name  Time  Order
1        16   John     5      0
0        23   Kate     3      0
2        32  Peter     2      0

这应该有帮助,但这不是随机选择,它保持了第一

cwxwcias

cwxwcias6#

如何使用random
就像这样
导入您提供的数据,

df=pd.read_csv('random_data.csv', header=0)

看起来像这样

Distance  Name  Time  Order
1        16  John     5      0
4         3  John     9      1
0        23  Kate     3      0
3        15  Kate     7      1

然后得到一个随机的列名

colname = df.columns[random.randint(1, 3)]

在它下面选择了“姓名”,

print(df[colname])
1    John
4    John
0    Kate
3    Kate
Name: Name, dtype: object

当然我可以把它浓缩成,

print(df[df.columns[random.randint(1, 3)]])
bis0qfac

bis0qfac7#

import pandas as pd

df = pd.DataFrame(
    {
        'Distance': [16, 31, 23, 15, 32, 26],
        'Name': ['John', 'John', 'Kate', 'Kate', 'Peter', 'Peter'],
        'Time': [5, 9, 3, 7, 2, 4],
        'Order': [0, 1, 0, 1, 0, 1],
    },
    index=[1, 4, 0, 3, 2, 5],
)
df.groupby('Name').sample(n=1)

相关问题