Pandas 我可以使用熊猫来创建有偏差的样本吗?
我的代码使用了一个名为booking status的列,该列为1表示是,0表示否。根据booking status,将从多个其他列中提取信息-no比yes多得多,因此我想采集一个包含所有yes和相同数量no的样本 当我使用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)
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]