在python中随机采样以将指标值保存到df

时间:2019-03-11 14:49:25

标签: python pandas

我是python的新手,我正在尝试在python 3中进行随机采样,在该示例中,我尝试根据当天是哪一天来选择随机采样,

df有一堆不同的列,其中包含日期,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().

预先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我确定对此有更好的解决方案,因为我不确定如何不使用索引进行替换,但我希望以下内容对您有用。

我们首先重置索引并将旧索引重命名为“ 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

这会产生您所追求的结果吗?