以等间距的方式平衡数据帧中的不同值组


ll = [['r']*5, ['sq']*3, ['r']*5, ['pu']*2, ['r']*5, ['dsp']*3, ['r']*5, ['l']*5, ['r']*5, ['dr']*3, ['r']*5, ['si']*4, ['r']*5,
['te']*2, ['r']*5, ['bc']*3, ['r']*5, ['lsr']*2, ['r']*5, ['jj'], ['r']*5,]
l = [item for sublist in ll for item in sublist]
df_l = pd.DataFrame(l)

列表ll是时间序列列表的简化版本(为了简化,这里省略了时间戳(。它包含11个独特的元素。我想平衡元素,这意味着所有元素或多或少都会出现同样频繁的情况。

示例:正如您所看到的,"jj"只出现一次。因此,我想减少其他元素,使它们也只出现一次。(在我的实际应用中,没有元素只出现一次。最不频繁的元素"jj"出现2000次,而"r"出现170000次。这只是一个有代表性的简化(

由于我处理的是时间序列数据,所以在所有元素组平衡之前,我不能随机删除更频繁元素的行,因为这可能会破坏时间序列模式。相反,我希望以等距的方式删除代表性过高的条目(例如。如果"te"的出现频率是"jj"的两倍,我想删除"te"中的每一行。这保证了只有";分辨率";时间序列模式的数量减少了,但模式本身仍然存在。我如何才能有效地做到这一点?

我会展示我的尝试,但我不知道如何处理。

关于:

s = df[0]  # Whatever the series actually is
# Group the rows into sets of consecutive duplicates
groups = [g for _,g in df.groupby((s != s.shift()).cumsum())]
# Find the smallest group of consecutive values
n = min(len(g) for g in groups)
# Trim each group to that size and stack them into a new DataFrame
df2 = pd.concat((g[:n] for g in groups), ignore_index=True)

对于您的数据,结果是:

0 r1平方2 r3蒲4 r5 dsp6 r7升8 r9 dr10 r11 si12 r13 te14 r公元前15年16 r17 lsr18 r19朝觐20 r

旁注:虽然它似乎可以满足您的要求,但我只想指出,不同值的表示/相对频率完全丢失了。

更好的解决方案可能是将每组减少相同的";百分比";。因此,如果最小的一组是3个,而不是将每组减少到3个项目,你应该将所有组减少到其大小的1/3。或者,就是你想要的。。。

最新更新