我是python的新手,我正在尝试在python 3中进行随机抽样,我试图根据它在哪一天选择随机抽样,
df有一堆不同的列,包括date,user_id,电话号码等。索引列是0或1,我试图只随机采样那些索引值为0,最后一列标记为“保持“所有数据当前都有”no_include“标签的位置
df.loc[(df.date <= '2019-01-02') & (df.date >= '2019-01-01')].loc[0].sample(n=100).replace(to_replace='no_include',value='include')
但是,我想用这些进行随机抽样,并且对于要保存的替换值,当我查看整个数据集时,我可以看到哪些应该是随机采样的,其中最后一列的所有值都是'no_include ,'我想将其中的100个更改为'include',代码可以工作,但它不会保存到df
我试过的另一个是
new = df.loc[(df.date <= '2019-01-02') &
(df.date >= '2019-01-01')].loc[0].sample(100)
然后,我只是将所有不同的日期附加在一起,但不确定如何获得未随机选择的值回到主
理想情况下,我认为循环是最好的选择,但无法弄清楚
for row in df:
if df.loc[(df.date <= '2019-01-02') & (df.date >= '2019-01-01')].loc[0]:
df.sample(n=100).replace(to_replace='no_include',value='include')
elif df.loc[(df.date <= '2019-01-03') & (df.date >= '2019-01-02')].loc[0]:
df.sample(n=50).replace(to_replace='no_include',value='include')
没有得到以下错误,我真的不确定我在循环中做错了什么,但我认为这将是最好的选择
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty,
a.bool(), a.item(), a.any() or a.all().
预先感谢您的帮助!
我确信有一个更好的解决方案,因为我不知道如何在不使用索引的情况下进行更换,但我希望以下内容适合您。
我们首先重置索引并将旧索引重命名为'index_'
df.reset_index(inplace=True)
df.rename(columns={'index': 'index_'}, inplace=True)
这让我们:
index_ date_ keep
0 0 2019-01-02 no_include
1 0 2019-01-02 no_include
2 0 2019-01-01 no_include
3 0 2019-01-01 no_include
4 1 2019-01-02 no_include
5 1 2019-01-01 no_include
然后我们可以使用您首先尝试的代码并保存采样的索引(由于我的6行df,我只选择了2)
selected = df[(df.date_ <= '2019-01-02') & (df.date_ >= '2019-01-01') & (df.index_ == 0)].sample(n=2).index
> Int64Index([3, 1], dtype='int64')
然后我们可以遍历这些,替换原始数据帧中的“保持”列,最后重置索引。
for i in selected:
df.at[i, 'keep'] = 'include'
df.set_index('index_', inplace=True)
这让我们...
date_ keep
index_
0 2019-01-02 no_include
0 2019-01-02 include
0 2019-01-01 no_include
0 2019-01-01 include
1 2019-01-02 no_include
1 2019-01-01 no_include
这会产生你追求的结果吗?