在pandas数据帧中,我有具有不同且大量行的子组。我希望减少用于初步分析的行数,同时确保数据在整个范围内仍然具有代表性。在
我用2个因子或参数('A','B'
)和每个因子2个级别或值('A1','A2','B1','B2'
)运行了一个模拟。每个模拟对应于'A','B'
值的组合。在计数器高于定义的数字(下例中为“35”)后,模拟停止。
对于每个模拟,计数器及其增加量都是不同的。在每个步骤中,从模拟中总结出一个值'eval'
。在
下面的示例显示了模拟结果的示例。现在,模拟实际运行的时间要长得多(举个例子来说,直到它超过10000),并且在我的初步分析中,绘制eval
值的演变图需要几个小时。在
此代码生成模拟结果的示例:
import pandas as pd
import numpy as np
columns = ['FactorA', 'FactorB', 'step']
data = [['A1', 'B1', 8], ['A1', 'B1', 13], ['A1', 'B1', 18], ['A1', 'B1', 23], ['A1', 'B1', 28], ['A1', 'B1', 33], ['A1', 'B1', 38],
['A1', 'B2', 7], ['A1', 'B2', 13],['A1', 'B2', 19],['A1', 'B2', 25],['A1', 'B2', 31],['A1', 'B2', 37],
['A2', 'B1', 6], ['A2', 'B1', 14],['A2', 'B1', 22],['A2', 'B1', 30],['A2', 'B1', 38],
['A2', 'B2', 10], ['A2', 'B2', 12],['A2', 'B2', 14],['A2', 'B2', 16],['A2', 'B2', 18],['A2', 'B2', 20],['A2', 'B2', 22],['A2', 'B2', 24],['A2', 'B2', 26],['A2', 'B2', 28],['A2', 'B2', 30],['A2', 'B2', 32],['A2', 'B2', 34],['A2', 'B2', 36]
]
df = pd.DataFrame(data, columns=columns)
df['eval'] = np.random.randint(1, 6, df.shape[0])
我尝试过这样做,但虽然它减少了数据点,但它不能平衡每个模拟的数据点数量:
^{pr2}$也尝试过:
^{3}$但它也不能平衡每次模拟的数据点数量。在
我想要一个数据帧,其中每个子组具有相同的行数。
为了确保选择或采样是平衡的,我希望使用.iloc
对每个子组的切片考虑确保为每个子组选择'n'
个成员的步骤。
最好是包含每个子组的第一行和最后一行。在
请看您帖子中的以下说明:
奇怪的是:
就集团平衡而言:
决定如何保持平衡:
当你下定决心时:
groupby
示例:如果要从df中选择2行的样本 每组(选项1),运行:
^{pr2}$如果要返回原始(单级)索引,请添加:
按照上面的指示。在
如果你喜欢选项2(分数),改变n=。。。到frac=。。。。在
在@Valdi_Bo的回答之后,我进入了Group By: split-apply-combine页面,将here、here、here、here、和{a6}中的想法混合起来,得到了一个不优雅但有效的解决方案。在
对于示例中的dataframe,我们可以计算每个组的行数:
这会产生:
^{pr2}$为了将每个组的数据行减少到一个以上但接近3的数字,每个子组的
step
列中的值之间的间距相等,并强制包含最大的step
,我使用:我们可以验证演示数据帧的行数:
这会产生:
如果有时间的话,我会尝试,并在修改它以使用与
steps
列范围相关的权重的示例函数时发布它。所以我得到了一半的数据点在前三分之一的范围内。在相关问题 更多 >
编程相关推荐