自定义 pandas 分组,针对一个区间列表进行分组

7

我有一个数据框 df:

     A    B
0   28  abc
1   29  def
2   30  hij
3   31  hij
4   32  abc
5   28  abc
6   28  abc
7   29  def
8   30  hij
9   28  abc
10  29  klm
11  30  nop
12  28  abc
13  29  xyz

df.dtypes

A    object        # A is a string column as well
B    object
dtype: object

我想使用此列表中的值进行分组:

i = np.array([ 3,  5,  6,  9, 12, 14])

基本上,df 中索引为0、1、2的所有行属于第一组,索引为3、4的行属于第二组,索引为5的行属于第三组,以此类推。

我的最终目标是:

A              B
28,29,30       abc,def,hij
31,32          hij,abc
28             abc
28,29,30       abc,def,hij
28,29,30       abc,klm,nop
28,29          abc,xyz

到目前为止使用 groupby + pd.cut 的解决方案如下:
df.groupby(pd.cut(df.index, bins=np.append([0], i)), as_index=False).agg(','.join)

          A            B
0  29,30,31  def,hij,hij
1     32,28      abc,abc
2        28          abc
3  29,30,28  def,hij,abc
4  29,30,28  klm,nop,abc
5        29          xyz

结果不正确 :-(

我该如何正确地做这件事?

2个回答

6

您非常接近,但在pd.cut中使用include_lowest=Trueright=False,因为您想要从bins中获取0索引,然后您不想包括每个bin的最后一个元素,即

idx = pd.cut(df.index, bins=np.append([0], i), 
                      include_lowest=True, right=False)
df.groupby(idx, as_index=False).agg(','.join)
A              B
28,29,30       abc,def,hij
31,32          hij,abc
28             abc
28,29,30       abc,def,hij
28,29,30       abc,klm,nop
28,29          abc,xyz
在这个表格中,列A是一组数字,列B是与这些数字相关联的一组字符串。每行都表示一个不同的组合。

@cᴏʟᴅsᴘᴇᴇᴅ 使用 np.put 添加一个新的方法 :-) - BENY

3
我认为这可能很快。
df['G']=0
np.put(df.G,i-1,[1]*len(i))
df.groupby(df.G.iloc[::-1].cumsum())[['A','B']].agg(lambda x: ','.join(x.astype(str))).sort_index(ascending =False)
Out[772]: 
          A            B
G                       
6  28,29,30  abc,def,hij
5     31,32      hij,abc
4        28          abc
3  28,29,30  abc,def,hij
2  28,29,30  abc,klm,nop
1     28,29      abc,xyz

我不知道np.put,知道新函数让人很兴奋。 - Bharath M Shetty
我很想看看这个解决方案的时间! - cs95

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接