Python 如何在数据帧中的两行之间随机采样元素?
我有一个熊猫数据帧df,格式如下: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
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选项。如果不进行替换,就不可能对比基础数据中更多的观测值进行采样。我更新了答案,以说明如何在不进行替换的情况下尽可能多地采集样本,但考虑到行数的变化