【问题标题】:Optimally sampling n rows from location Pandas dataframe从位置 Pandas 数据框中优化采样 n 行
【发布时间】:2020-07-05 03:23:29
【问题描述】:

我有一个纬度和经度的数据框。我想获得一个大小为 n_samples 的样本,该样本覆盖了数据框中的大部分区域。起初,我想先按经纬度对数据帧进行排序,然后使用模运算来选择均匀分布的行。但是,这在我希望对 100 行中的 27 行进行采样的情况下不起作用,因为 100 % 27 不是 0。请注意,当尝试使用 n_sample=80 时,这个问题会变得更糟(因为它会对所有 100 行进行采样行)。所以以后简单地调整行数是没有用的。

import random
import pandas as pd

n_samples = 27
lat = [random.uniform(30, 50) for i in range(100)]
lon = [random.uniform(-130, -100) for i in range(100)]

loc_df = pd.DataFrame([lat, lon]).T
loc_df.columns = ['lat', 'lon']

# Sort loc_df by lat/lon
loc_df = loc_df.sort_values(['lat', 'lon'])

# Sample every n rows 
# Tends to sample either too many or too few rows
# In this case, we will be sampling 24 instead of 27 rows

every_n = round(loc_df.shape[0]/n_samples) 
sample_df = loc_df[::every_n].reset_index(drop=True)

【问题讨论】:

    标签: python pandas sorting sample


    【解决方案1】:

    首先想到的是来自 sklearn 的“train_test_split”。

    from sklearn.model_selection import train_test_split
    
    test_pct = 1 - (n_samples / len(loc_df))
    
    
    X = loc_df.iloc[:,0]
    Y = loc_df.iloc[:,1]
    
    X_sample, X_remain, Y_sample, Y_remain = train_test_split( X, Y, test_size=test_pct, random_state=0)
    
    sample_df = X_sample.to_frame().join(Y_sample).reset_index(drop=True)

    这会根据您的 n_samples 和数据框的大小分配一个 test_pct 变量

    从 loc_df 创建 X (lat) 和 Y(lon) 数组

    使用“train_test_split”随机选择“n_samples”

    然后创建包含“n_samples”数据的 sample_df 数据框。

    这对你的目的有用吗?

    【讨论】:

    • 我认为这对于问题的目的来说太随机了(尽可能等间距)。也许是一些迭代过程,您从随机采样开始,然后测量所有样本索引之间的差异向量(不要忘记添加边),然后在任何迭代中减少 1 个大于中位数的值并增加任何小于中位数,直到最佳……或本着这种精神。
    猜你喜欢
    • 2013-01-13
    • 2014-07-12
    • 2019-04-15
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 2019-01-26
    相关资源
    最近更新 更多