【问题标题】:How to randomly extract n contiguous rows in a pandas DataFrame?如何在 pandas DataFrame 中随机提取 n 个连续行?
【发布时间】:2021-05-02 18:20:58
【问题描述】:

我想从 DataFrame 中随机选择 n 个连续行。 这是我能想到的唯一有效代码:

random_row = df.sample(n=1)
start = random_row.index
end = start + n - 1
n_rows = df.iloc[int(start.values):int(end.values)]

但我觉得它的代码很糟糕,就像 hacky 一样,而且不是很 Python。出于某种原因,我无法使用Int64Indexes,这感觉很奇怪。我希望能够通过...索引来索引 DataFrame,但它会引发一些错误。

谁能建议如何使我的代码更好或推荐一种更好的方法来做我正在做的事情?

【问题讨论】:

  • 这能回答你的问题吗? Random blocks of data in Pandas
  • @HenryEcker 不幸的是不是因为我的随机行必须事先选择,然后我必须得到以下 n 行。

标签: python pandas


【解决方案1】:

我发现您当前的代码存在 2 个问题:

  • 假定行按整数顺序索引(0、1、2、3、...)
  • 可能没有足够的行从 start 向下直到数据框的末尾来满足您的要求

稍微改进的版本:

def random_block(frame, k, wrap=True):
    "Return a random block of k contiguous rows from the DataFrame"
    n = len(frame)
    if k == 0:
        raise ValueError('k must be >0')
    elif k > n:
        raise ValueError('k must not be longer than the DataFrame')
    elif k == n:
        return frame
    
    start = np.random.randint(0, n - (0 if wrap else k - 1))
    end = start + k
    return frame.iloc[np.arange(n).take(range(start,end), mode='wrap')]
    
# Usage
result = random_block(df, 10)

【讨论】:

  • 单字母变量名和缺少命名参数使我无法支持这个原本很好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
相关资源
最近更新 更多