【问题标题】:Sampling rows with sample size greater than length of DataFrame样本大小大于 DataFrame 长度的采样行
【发布时间】:2019-05-31 19:39:36
【问题描述】:

我被要求根据旧变量的数据生成一个新变量。基本上,被问到的是我从原始值中随机取值(通过使用random 函数),并且观察值至少是旧值的 10 倍,然后将其保存为新变量。

这是我的数据集:https://archive.ics.uci.edu/ml/machine-learning-databases/forest-fires/forestfires.csv

我想使用的变量是area

这是我的尝试,但它给了我一个module object is not callable 错误:

import pandas as pd
import random as rand

dataFrame = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/forest-fires/forestfires.csv")

area = dataFrame['area']

random_area = rand(area)

print(random_area)

【问题讨论】:

标签: python pandas dataframe random sample


【解决方案1】:

您可以将sample 函数与replace=True 一起使用:

df = df.sample(n=len(df) * 10, replace=True)

或者,要对区域列进行采样,请使用

area = df.area.sample(n=len(df) * 10, replace=True)

另一个选项涉及np.random.choice,看起来像:

df = df.iloc[np.random.choice(len(df), len(df) * 10)]

这个想法是从 0-len(df)-1 生成随机索引。第一个参数指定上限,第二个参数 (len(df) * 10) 指定要生成的索引数。然后我们使用生成的索引来索引df

如果你只是想得到area,这就足够了。

area = df.iloc[np.random.choice(len(df), len(df) * 10), df.columns.get_loc('area')]

Index.get_loc 将“区域”标签转换为位置,用于iloc


df = pd.DataFrame({'A': list('aab'), 'B': list('123')})
df
   A  B
0  a  1
1  a  2
2  b  3

# Sample 3 times the original size
df.sample(n=len(df) * 3, replace=True)

   A  B
2  b  3
1  a  2
1  a  2
2  b  3
1  a  2
0  a  1
0  a  1
2  b  3
2  b  3

df.iloc[np.random.choice(len(df), len(df) * 3)]

   A  B
0  a  1
1  a  2
1  a  2
0  a  1
2  b  3
0  a  1
0  a  1
0  a  1
2  b  3

【讨论】:

  • 顺便说一句。关于代码:df.sample(n=len(df) * 10, replace=True)。为什么要将整个数据集乘以 10?
  • @OnurOzbek 我没有将数据集乘以 10,我将样本大小指定为 len(df) 乘以 10,因为您的要求是“至少有 10 倍于旧的观测值”
  • @OnurOzbek,回复:“您需要解释语法”。有更好的方法可以向志愿者请求帮助。例如,“请您解释一下ilocget_loc 的工作原理”?你很幸运,coldspeed 已经回复了,我将不太可能回复用户的此类评论。
  • 谢谢,@coldspeed。我已经接受了你的回答。我很感激。
猜你喜欢
  • 2016-02-11
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 2019-03-19
相关资源
最近更新 更多