【发布时间】:2019-11-05 15:45:52
【问题描述】:
在 pandas 数据框中,我有具有不同且大量行的子组。我想减少初步分析的行数,同时确保数据在整个范围内仍然具有代表性。
我使用 2 个因子或参数 ('A','B') 以及每个因子 ('A1','A2','B1','B2') 的 2 个水平或值运行了一个模拟。每个模拟对应于'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])
我试过这个,但是虽然它减少了数据点,但它并没有平衡每次模拟的数据点数量:
df_reduced = df.iloc[::2]
也试过了:
df_reduced = df.sample(n=int(len(df)/6))
但它也不平衡每次模拟的数据点数量。
我想要一个 DataFrame,其中每个子组具有相同的行数。
为了确保选择或采样是平衡的,我希望使用.iloc 对每个子组进行切片时考虑确保为每个子组选择'n' 成员的步骤。
最好包含每个子组的第一行和最后一行。
【问题讨论】:
标签: python pandas pandas-groupby