每n个值采样一次,或与n个值最接近的匹配值

2024-04-25 22:56:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有点奇怪的问题。我有一个非常大的数据帧,我正在尝试样本。你知道吗

我的数据如下所示(两列x和y):

x,y
1,'a'
1,'b'
1,'c'
3,'a'
3,'b'
3,'c'
6,'a'
6,'b'
6,'c'

我想根据“x”的值取样。我希望每32个x值中有一个样本(基于x的变化,所以我希望在1和32之间采样一次,即使只有一个x值在1和32之间)。你知道吗

我想做这样的事情:df[df['x'] % 32 == 0]。问题是x的值不一定是均匀分布的(虽然它们是“近似的”,但并不总是如此——例如在给定的示例中)。例如,如果某个子问题中x的所有值都是奇数,则上述采样将返回空数据帧。实际上,我希望每32'x采样一次,或者如果不存在这样的值,则取最接近第32个值的值(近似最接近是可以接受的——例如,取下一个可用值就可以了)。你知道吗

因此,如果我有一系列X的[0, 10, 32, 39, 64, 70, 73, 74, 97, 100, 110, 129],我想对X值与[0, 32, 64, 97, 129]匹配的行进行采样。你知道吗

理想情况下,我还可以将此操作矢量化,因为数据帧通常相当大。你知道吗


Tags: 数据示例df情况事情矢量化样本奇数
2条回答

您可以使用列表理解动态创建bin,然后使用pd.cut创建组,并使用groupbysample(1)为“X”的每32个值获取一条记录。你知道吗

df = pd.DataFrame({'X':np.random.randint(0, 100, 5000),'Y':np.random.choice(list('ABCDEF'),5000)})

bins = [i for i in np.arange(df.X.min(), df.X.max(), 32)] + [np.inf]

df.groupby(pd.cut(df.X,bins=bins), as_index=False).apply(lambda x: x.sample(1).values)

输出:

[[15 'F']
 [51 'A']
 [90 'C']
 [98 'A']]
df = pd.DataFrame({'x': [1, 1, 1, 3, 3, 3, 6, 6, 6],
                   'y': ['a', 'b', 'c'] * 3})

x = [0, 10, 32, 39, 64, 70, 73, 74, 97, 100, 110, 129]
spacer = 32

X = pd.Series(x)
# For each value `n` in the range 0, 32, 64, ..., 129, find the index location of the 
# nearest value in X via `X.sub(n).abs().idxmin()`. Then use these index locations 
# to find the actual target values in X via `loc`.
target_vals = X.loc[[X.sub(n).abs().idxmin() 
                     for n in xrange(0, x[-1], spacer)]].tolist()  # `range` in Python 3.
>>> target_vals
[0, 32, 64, 97, 129]

# Sample the target values, taking a sample size of 1.
df[df['x'].isin(target_vals)].groupby('x').apply(lambda group: group.sample(1))

相关问题 更多 >