【问题标题】:random sampling with Pandas data frame disjoint groupsPandas 数据框不相交组的随机抽样
【发布时间】:2017-10-15 21:23:57
【问题描述】:

我需要通过属性'ids' 将一个数据框随机分成两个不相交的集合。例如,考虑以下数据框:

df=
Out[470]: 
          0     1     2     3       ids
0      17.0  18.0  16.0  15.0      13.0
1      18.0  16.0  15.0  15.0      13.0
2      16.0  15.0  15.0  16.0      13.0
131    12.0   8.0  21.0  19.0      14.0
132     8.0  21.0  19.0  20.0      14.0
133    21.0  19.0  20.0   9.0      14.0
248     NaN   NaN  12.0  11.0      17.0
249     NaN  12.0  11.0  10.0      17.0
250    12.0  11.0  10.0   NaN      17.0
287     3.0   3.0   1.0   8.0      20.0
288     3.0   1.0   8.0   3.0      20.0
289     1.0   8.0   3.0   3.0      20.0
413    21.0   7.0  16.0  18.0      25.0
414     7.0  16.0  18.0  19.0      25.0
415    16.0  18.0  19.0  18.0      25.0
665    10.0   8.0   8.0   7.0      27.0
666     8.0   8.0   7.0   9.0      27.0
667     8.0   7.0   9.0   8.0      27.0
790     NaN   NaN  15.0   NaN      33.0
791     NaN  15.0   NaN  10.0      33.0
792    15.0   NaN  10.0   NaN      33.0
812     NaN  16.0   NaN  17.0      34.0
813    16.0   NaN  17.0   NaN      34.0
814     NaN  17.0   NaN  13.0      34.0
944     3.0   4.0   3.0  18.0      35.0
945     4.0   3.0  18.0  18.0      35.0
946     3.0  18.0  18.0  11.0      35.0
1059    9.0  10.0   3.0   4.0      56.0
1060   10.0   3.0   4.0   3.0      56.0
1061    3.0   4.0   3.0   3.0      56.0
    ...   ...   ...   ...       ...
10125   NaN   9.0   5.0   5.0  101317.0
10126   9.0   5.0   5.0   5.0  101317.0
10127   5.0   5.0   5.0   7.0  101317.0

我需要得到两个(以一些分数大小随机分隔)数据帧,其中 no 相交值为ids

我知道如何以“非熊猫”的方式解决它:

  • 获取ids的唯一值
  • 将唯一值随机分成两个不相交的组
  • 使用.isin()在两组中根据ids的值选择行

我想知道是否有一种简单而简洁的方法可以使用一些 pandas 内置函数,例如.sample()

【问题讨论】:

    标签: python pandas disjoint-sets


    【解决方案1】:

    使用sklearn.model_selection.GroupShuffleSplit进行拆分:

    from sklearn.model_selection import GroupShuffleSplit
    
    # Initialize the GroupShuffleSplit.
    gss = GroupShuffleSplit(n_splits=1, test_size=0.5)
    
    # Get the indexers for the split.
    idx1, idx2 = next(gss.split(df, groups=df.ids))
    
    # Get the split DataFrames.
    df1, df2 = df.iloc[idx1], df.iloc[idx2]
    

    【讨论】:

    • 这确实是一个非常好的方法——我以前从未使用过它。谢谢你的提示!
    【解决方案2】:

    更新:

    df1 = df.sample(frac=1).loc[df.ids % 2 == 0]
    df2 = df.loc[df.index.difference(df1.index)]
    

    OLD 不正确(它不关心分隔 ID)答案:

    您可以先使用sample(frac=1) 随机播放您的DF,然后使用np.split()

    df1, df2 = np.split(df.sample(frac=1), 2)
    

    【讨论】:

    • @MaxU,谢谢,但它不起作用。我在两组中都得到了相同的“ID”。
    • 太棒了!像魅力一样工作! (我正在学习 Pandas,所以如此巧妙的解决方案非常有价值)
    • @ArnoldKlein,很高兴我能帮上忙 :-)
    • 这并不是真正随机的,因为df1 总是有偶数ID,而df2 总是有奇数ID。根据 id 的生成方式,这可能会引入偏见。它还取决于偶数和奇数 id 的相似分布。
    • @MaxU,对不起,但根的答案更好。谢谢。
    猜你喜欢
    • 2015-08-16
    • 2018-09-12
    • 2022-09-28
    • 2016-09-06
    • 1970-01-01
    • 2023-02-14
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多