如何根据值的频率拆分 pandas 数据框

我有兴趣根据 B 列中条目的频率将该数据帧分成 20 个较小的数据帧。B 具有数字条目,其中一些条目重复多次,如下所示。


 A (index)              B (Column of interest) 

    0                              1

    1                              2

    2                              2

    3                              2  

    4                              3

   ...                            ... 

  25643                          5238

  25644                          5238 

  25645                          5238

  25646                          5238

  25647                          5238

我希望每个频率都有一个数据框:1-10、11-20、21-30、....、191-200。意思是,1-10 数据帧包含 B 中在该数据帧中出现 1 到 10 次的所有条目。同样,11-20 数据帧包含在整个数据帧中出现 11 次和 20 次的所有条目。


最后,我应该有 20 个数据帧,所有这些数据帧都分割了这个主数据帧。


我所能做的就是使用以下代码从 B 列中找到与这些 freeuqncies 相对应的所需条目中的不同数量的条目:


   df.loc[(df['B'] > 0) & (df['B'] < 11)]

   df.loc[(df['B'] > 10) & (df['B'] < 21)]

                    ...

   df.loc[df['B'] > 190) & (df['B'] < 201)

   

我一直在考虑使用该groupby()函数,但是,我还没有找到一种根据频率对列条目进行分组的方法。


任何帮助表示赞赏!


芜湖不芜
浏览 22回答 1
1回答

慕容708150

计算数据帧中每个值的出现次数,将频率范围以 10 为一组进行分组,然后为每个范围创建dict一个DataFrames。垃圾箱标签将成为dict钥匙该bins列是分类的,因此.groupby将为每个标签创建一个组,即使该组为空,因此使用pandas.DataFrame.empty,因此只有非空组才会添加到dictof 中DataFrames。替换g: dfg为中g: pd.DataFrame(dfg.B)只有列。 Bdict使用dfg.reset_index(drop=True)或pd.DataFrame(dfg.B).reset_index(drop=True)删除原始索引。labels使用,因为它们更容易用作dict密钥如果不使用labels,dict键将是Interval, 就像[Interval(10, 20, closed='right'),这很麻烦。df.B.map(df.groupby('B')['B'].count())也有效,但不是必需的。使用pandas.Series.value_counts()和pandas.Series.map在 中创建一个计数列df,它将传达列中值的频率B。用于pd.cut对频率范围进行分类pandas.DataFrame.groupby与 a 一起使用可根据 bin 标签 dict-comprehension创建dictof 。DataFramesimport pandas as pdimport numpy as np# setup test dataframenp.random.seed(365)df = pd.DataFrame({'B': np.random.randint(5238, size=(200000))})# add a counts column to the dataframedf['counts'] = df.B.map(df.B.value_counts())# create a bins column for the frequency rangebins = range(0, 201, 10)labels = range(10, 201, 10)df['bins'] = pd.cut(df.counts, bins=bins, right=True, labels=labels)# display(df.head())      B  counts bins0  2740      37   401  4897      41   502  4955      45   503   428      31   404   226      34   40# create a dict of dataframes for the non-empty binsdfd = {g: dfg for g, dfg in df.groupby('bins') if not dfg.empty}# print dict keysdfd.keys()[out]:dict_keys([20, 30, 40, 50, 60, 70])# display(dfd[20].head())          B  counts bins5350   4986      19   205646   4952      20   2011232  3728      19   2011707  2819      20   2013547  3728      19   20
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python