Python 如何根据从数据帧派生的组的属性将元素分配给数据帧的列?

Python 如何根据从数据帧派生的组的属性将元素分配给数据帧的列?,python,pandas,dataframe,Python,Pandas,Dataframe,假设我按如下方式导入pandas和numpy: import pandas as pd import numpy as np 并构造以下数据帧: df = pd.DataFrame({'Alpha' ['A','A','A','B','B','B','B','C','C','C','C','C'],'Beta' : np.NaN}) …这给了我: Alpha Beta 0 A NaN 1 A NaN 2 A NaN 3 B

假设我按如下方式导入pandas和numpy:

import pandas as pd
import numpy as np
并构造以下数据帧:

df = pd.DataFrame({'Alpha' 
['A','A','A','B','B','B','B','C','C','C','C','C'],'Beta' : np.NaN})
…这给了我:

    Alpha  Beta
0      A   NaN
1      A   NaN
2      A   NaN
3      B   NaN
4      B   NaN
5      B   NaN
6      B   NaN
7      C   NaN
8      C   NaN
9      C   NaN
10     C   NaN
11     C   NaN
如何使用pandas获取以下数据帧

df_u = pd.DataFrame({'Alpha':['A','A','A','B','B','B','B','C','C','C','C','C'],'Beta' : [1,2,3,1,2,2,3,1,2,2,2,3]})
i、 e.这:

   Alpha  Beta
0      A     1
1      A     2
2      A     3
3      B     1
4      B     2
5      B     2
6      B     3
7      C     1
8      C     2
9      C     2
10     C     2
11     C     3
一般来说,我试图实现的目标可以用以下逻辑来描述:

假设我们将df按Alpha分组

对于每个组,对于组中的每一行

  • 如果行的索引等于组中行的最小索引,则为该行的Beta指定1

  • 否则,如果行的索引等于组中行的最大索引,则为该行的Beta指定3

  • 否则将该行的Beta值指定为2


方法1

使用:



条件列表的详细信息:

print(mask1)
0      True
1     False
2     False
3      True
4     False
5     False
6     False
7      True
8     False
9     False
10    False
11    False
Name: Alpha, dtype: bool



方法2

使用:


让我们使用复制的:

df.loc[~df.duplicated('Alpha', keep='last'), 'Beta'] = 3
df.loc[~df.duplicated('Alpha', keep='first'), 'Beta'] = 1
df['Beta'] = df['Beta'].fillna(2)
print(df)
输出:

   Alpha  Beta
0      A   1.0
1      A   2.0
2      A   3.0
3      B   1.0
4      B   2.0
5      B   2.0
6      B   3.0
7      C   1.0
8      C   2.0
9      C   2.0
10     C   2.0
11     C   3.0
假设“Alpha”列已排序,您可以这样做

df[“Beta”]=2
df.loc[~(df[“Alpha”]==df[“Alpha”].shift(),“Beta”]=1
df.loc[~(df[“Alpha”]==df[“Alpha”].shift(-1)),“Beta”]=3
df
print(mask2)
0     False
1      True
2     False
3     False
4      True
5      True
6     False
7     False
8      True
9      True
10     True
11    False
Name: Alpha, dtype: bool
print(mask3)
0     False
1     False
2      True
3     False
4     False
5     False
6      True
7     False
8     False
9     False
10    False
11     True
Name: Alpha, dtype: bool
def assign_value(x):
    return pd.Series([1]+[2]*(len(x)-2)+[3])
new_df=df.groupby('Alpha').apply(assign_value).rename('Beta').reset_index('Alpha') 
print(new_df)
  Alpha  Beta
0     A     1
1     A     2
2     A     3
0     B     1
1     B     2
2     B     2
3     B     3
0     C     1
1     C     2
2     C     2
3     C     2
4     C     3
df.loc[~df.duplicated('Alpha', keep='last'), 'Beta'] = 3
df.loc[~df.duplicated('Alpha', keep='first'), 'Beta'] = 1
df['Beta'] = df['Beta'].fillna(2)
print(df)
   Alpha  Beta
0      A   1.0
1      A   2.0
2      A   3.0
3      B   1.0
4      B   2.0
5      B   2.0
6      B   3.0
7      C   1.0
8      C   2.0
9      C   2.0
10     C   2.0
11     C   3.0