Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 我可以使用熊猫来创建有偏差的样本吗?_Pandas_Sample - Fatal编程技术网

Pandas 我可以使用熊猫来创建有偏差的样本吗?

Pandas 我可以使用熊猫来创建有偏差的样本吗?,pandas,sample,Pandas,Sample,我的代码使用了一个名为booking status的列,该列为1表示是,0表示否。根据booking status,将从多个其他列中提取信息-no比yes多得多,因此我想采集一个包含所有yes和相同数量no的样本 当我使用 samp = rslt_df.sample(n=298, random_state=1, weights='bookingstatus') 我得到一个错误: ValueError:p中的非零项少于大小 有没有这样做的方法?如果我们的整个数据集如下所示: print(df)

我的代码使用了一个名为booking status的列,该列为1表示是,0表示否。根据booking status,将从多个其他列中提取信息-no比yes多得多,因此我想采集一个包含所有yes和相同数量no的样本

当我使用

samp = rslt_df.sample(n=298, random_state=1, weights='bookingstatus')
我得到一个错误:

ValueError:p中的非零项少于大小


有没有这样做的方法?

如果我们的整个数据集如下所示:

print(df)                                                                               
   c1  c2
0   1   1
1   0   2
2   0   3
3   0   4
4   0   5
5   0   6
6   0   7
7   1   8
8   0   9
9   0  10
我们可以决定使用函数从中采样。默认情况下,此函数将采样而不进行替换。也就是说,如果指定的观测值数量大于初始数据集中的观测值数量,您将收到一个错误:

df.sample(20)
ValueError: Cannot take a larger sample than population when 'replace=False'
在您的情况下,ValueError来自权重参数:

df.sample(3,weights='c1')
ValueError: Fewer non-zero entries in p than size
为了解释文档,使用c1列作为权重参数意味着c1列中值较大的行更有可能被采样。具体来说,sample函数不会从该列中拾取零值。我们可以使用以下任一方法修复此错误

方法1:将replace参数设置为true:

m1 = df.sample(3,weights='c1', replace=True)
print(m1)                                                                               
   c1  c2
0   1   1
7   1   8
0   1   1
方法2:确保n参数等于或小于c1列中的1s数:


如果你决定使用这种方法,你就不会真正地进行抽样。您实际上只是过滤掉c1值为0的任何行。

我最终能够做到这一点,下面是我如何做到的:

bookingstatus_count = df.bookingstatus.value_counts()
print('Class 0:', bookingstatus_count[0])
print('Class 1:', bookingstatus_count[1])
print('Proportion:', round(bookingstatus_count[0] / bookingstatus_count[1], 2), ': 1')
# Class count
count_class_0, count_class_1 = df.bookingstatus.value_counts()

# Divide by class
df_class_0 = df[df['bookingstatus'] == 0]

df_class_0_under = df_class_0.sample(count_class_1)
df_test_under = pd.concat([f_class_0_under, df_class_1], axis=0)
df_class_1 = df[df['bookingstatus'] == 1]
基于此,


谢谢大家

您的数据帧rslt\U df中有多少行?如果数据帧中的行数少于298行,则可能超出了要从中采样的行数限制。您可以通过设置replace=False来修复此问题。谢谢您的帮助。因此,如果我正在寻找一种方法来获取c1=1和c1=0的偶数行,那么我需要找到一种不同的方法来实现这一点。可以这样做:df[df['c1']==1]。sample2.appenddf[df['c1']==0]。sample2
bookingstatus_count = df.bookingstatus.value_counts()
print('Class 0:', bookingstatus_count[0])
print('Class 1:', bookingstatus_count[1])
print('Proportion:', round(bookingstatus_count[0] / bookingstatus_count[1], 2), ': 1')
# Class count
count_class_0, count_class_1 = df.bookingstatus.value_counts()

# Divide by class
df_class_0 = df[df['bookingstatus'] == 0]

df_class_0_under = df_class_0.sample(count_class_1)
df_test_under = pd.concat([f_class_0_under, df_class_1], axis=0)
df_class_1 = df[df['bookingstatus'] == 1]