Python 如何在数据帧中的两行之间随机采样元素?

Python 如何在数据帧中的两行之间随机采样元素?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个熊猫数据帧df,格式如下: ColumnA. ColumnB. IsMatching 0 sadasdsad. asdsadsad True 1 asdsadsadas. asdsadasd. False 2 asdsadasd. asdsadsad. False 3 dfsdfsdfi ijijiiijj. False 4 sdasdsads. asdsadsad True 5 dfsdfs

我有一个熊猫数据帧df,格式如下:

   ColumnA.     ColumnB.      IsMatching
0 sadasdsad.    asdsadsad      True
1 asdsadsadas.  asdsadasd.     False
2 asdsadasd.    asdsadsad.     False
3 dfsdfsdfi     ijijiiijj.     False
4 sdasdsads.    asdsadsad      True
5 dfsdfsdfi     ijijiiijj.     False
6 jijijijij.    ijijijiji.     False
7 assdssads.    asd222sad      True
我想创建一个新的数据帧,比如new_df,它包含n个随机采样的行,在两个真实实例之间的原始df中IsMatching==False。例如,在索引0和4之间随机选择n行,同样在索引4和7之间随机选择n行,以此类推

新_df的一个示例所需输出是在df中的真实实例之间随机采样2行。请注意,真实实例之间的行数可能少于2行,在这种情况下,我希望新的_df包含任何行

1 asdsadsadas.  asdsadasd.     False
3 dfsdfsdfi     ijijiiijj.     False
5 dfsdfsdfi     ijijiiijj.     False
6 jijijijij.    ijijijiji.     False
我在Pandas中搜索了df.sample方法,但它似乎没有在两行之间进行采样的规定。任何帮助和建议都将不胜感激。

这应该可以:

从io导入StringIO 数据=StringIO 专栏作家。B栏。匹配 0 sadasdsad。asdsad-True 1阿斯塔达斯。asdsadasd。错误的 2 asdsadasd。asdsad。错误的 3 DFSDFI ijiiij。错误的 4个SDASDS。asdsad-True 5 DFSDFI ijiiij。错误的 6吉吉吉。哎呀。错误的 7阿萨德。asd222真的很悲伤 作为pd进口熊猫 df=pd.read_csvdata,sep='\s+' df['interween_rows_group']=df['IsMatching'].cumsum 取1个样本 df.query'IsMatching==False'.groupby'between\u rows\u group'.sample1 用替换品取样 df.query'IsMatching==False'.groupby'between\u rows\u group'.sample5,replace=True 尽可能多地取样 df.query'IsMatching==False'.groupby'between\u rows\u group'.applylambda x:x.samplemin5,lenx.reset\u indexdrop=True 这应该起作用:

从io导入StringIO 数据=StringIO 专栏作家。B栏。匹配 0 sadasdsad。asdsad-True 1阿斯塔达斯。asdsadasd。错误的 2 asdsadasd。asdsad。错误的 3 DFSDFI ijiiij。错误的 4个SDASDS。asdsad-True 5 DFSDFI ijiiij。错误的 6吉吉吉。哎呀。错误的 7阿萨德。asd222真的很悲伤 作为pd进口熊猫 df=pd.read_csvdata,sep='\s+' df['interween_rows_group']=df['IsMatching'].cumsum 取1个样本 df.query'IsMatching==False'.groupby'between\u rows\u group'.sample1 用替换品取样 df.query'IsMatching==False'.groupby'between\u rows\u group'.sample5,replace=True 尽可能多地取样 df.query'IsMatching==False'.groupby'between\u rows\u group'.applylambda x:x.samplemin5,lenx.reset\u indexdrop=True
发布您希望新的_df的外观。@elPastor我已经添加了所需的示例输出。谢谢发布您希望新的_df的外观。@elPastor我已经添加了所需的示例输出。谢谢谢谢你的回答。但是,它似乎只采样了1行?当我使用类似这样的df.query'IsMatching==False'.groupby'between_rows\u group'.sample10对更多行进行采样时,我会得到一个错误值error:replace=False时,采样不能大于population。有没有办法避免这个问题,因为可能有两行之间没有10行的情况——在这种情况下,它应该选择两行之间的任何一行。谢谢如果要对10行进行采样,请传递replace=True选项。如果不进行替换,就不可能对比基础数据中更多的观测值进行采样。我更新了答案,以说明如何在不进行替换的情况下尽可能多地采集样本,但考虑到答案的行数变化。但是,它似乎只采样了1行?当我使用类似这样的df.query'IsMatching==False'.groupby'between_rows\u group'.sample10对更多行进行采样时,我会得到一个错误值error:replace=False时,采样不能大于population。有没有办法避免这个问题,因为可能有两行之间没有10行的情况——在这种情况下,它应该选择两行之间的任何一行。谢谢如果要对10行进行采样,请传递replace=True选项。如果不进行替换,就不可能对比基础数据中更多的观测值进行采样。我更新了答案,以说明如何在不进行替换的情况下尽可能多地采集样本,但考虑到行数的变化