对多列进行分组,并通过考虑每列的开始和结束为每列赋值(Pandas)。

问题描述 投票:0回答:1

我有一个数据框架,看起来像这样的

df1
    v   w   x   y                               
4   0   1   a   b
5   0   1   a   a
_________________
6   0   2   a   b
_________________
2   0   3   a   b 
- - - - - - - - -   
3   1   2   a   b
_________________
15  1   3   a   b
12  1   3   b   b
_________________
13  1   1   a   b
- - - - - - - - - 
15  3   1   a   b
14  3   1   b   a
8   3   1   a   b
9   3   1   a   a

所以df1按v和w分组(线),并与包含x和y的另一个df合并。我需要一个新的列z,从x和y中选出正确的组,条件如下。

  1. 在每个子组'V'(虚线)中,第一组应该是'x'(在组内x总是以'a'开头,y总是以'b'开头)。
  2. 根据每组的末尾字母(a或b),下一组应该以b(y列)或a(x列)开始。
  3. 如果两组都以相同的字母结尾,则从'x'中选择下一组。

应该是这样的。

df1
    v   w   x   y   z                            
4   0   1   a   b   a
5   0   1   a   a   a
_____________________
6   0   2   a   b   b
_____________________
2   0   3   a   b   a
- - - - - - - - - -- -   
3   1   2   a   b   a
_____________________
15  1   3   a   b   b
12  1   3   b   b   b
_____________________
13  1   1   a   b   a
 - - - - - - - - - - 
15  3   1   a   b   a
14  3   1   b   a   b
8   3   1   a   b   a
9   3   1   a   a   a

所以基本上,在 "v "的子组中,一个组的最后一个字母和下一个组的第一个字母应该是不同的,这可以理解吗?

python pandas grouping pandas-groupby
1个回答
1
投票

IIUC

df=df.reset_index(drop=True)
s=pd.DataFrame(np.sort(df[['x','y']],axis=1),index=df.index)[1].iloc[::-1].ne('b').cumsum()
df.groupby([df.v,df.w,s]).ngroup()
0     0
1     0
2     1
3     2
4     4
5     5
6     5
7     3
8     6
9     6
10    6
11    6
dtype: int64
© www.soinside.com 2019 - 2024. All rights reserved.