【问题标题】:Split pandas dataframe into mutually exclusive subsets将 pandas 数据框拆分为互斥的子集
【发布时间】:2017-03-17 21:04:55
【问题描述】:

我正在对 pandas 数据框中包含的数据进行回归树分析。为了进行 V 折交叉验证,我需要将我的数据分成 V 个随机互斥的子集

这是我到目前为止所做的工作,我在数据框中添加了一个新列 V = 10,以表示每个样本属于哪个子集:

def Vfold_Subsets(Data,V):
    subs = Data
    Data['V'] = V
    N = Data.shape[0]
    n = N//V
    for v in range(1,V):
        sample = subs.sample(n = n)
        Data['V'][Data.index.isin(sample.index)] = v
        subs.drop(sample.index)
    return Data 

这种方法有效,但我感觉有更好的方法吗?这种方法的一个缺点是如果 N = 108,那么

for v in range(1,V+1):
    print (v,': ',Data['V'][Data['V']==v].count())

返回:

1 :  10
2 :  10
3 :  10
4 :  10
5 :  10
6 :  10
7 :  10
8 :  10
9 :  10
10 :  18

而且我认为如果我能实现这样的目标会更好

1 :  10
2 :  11
3 :  11
4 :  11
5 :  11
6 :  11
7 :  11
8 :  11
9 :  10
10 :  10

这样我就不会将所有剩余的样本都集中到最后一个垃圾箱中。

【问题讨论】:

  • 组需要均匀吗?
  • 我不知道他们绝对需要,如果我有足够大的 N 我认为这不重要吗?但我更喜欢他们。

标签: python pandas random


【解决方案1】:

定义你的功能

def Vfold_Subsets(Data, V):
    return Data.assign(
        V=np.random.permutation(np.arange(len(Data))) % V)

【讨论】:

  • 效果很好,谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 2016-06-24
  • 2017-05-28
  • 1970-01-01
相关资源
最近更新 更多