如何根据从该数据框派生的组的属性将元素分配给熊猫数据框的列?

假设我按如下方式导入 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]})

即:


   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,


否则,如果行的索引等于组中行的最大索引,则为该行分配 3 到 Beta,


否则将 2 分配给该行的 Beta。


三国纷争
浏览 97回答 3
3回答

德玛西亚99

让我们使用重复的:df.loc[~df.duplicated('Alpha', keep='last'), 'Beta'] = 3df.loc[~df.duplicated('Alpha', keep='first'), 'Beta'] = 1df['Beta'] = df['Beta'].fillna(2)print(df)输出:   Alpha  Beta0      A   1.01      A   2.02      A   3.03      B   1.04      B   2.05      B   2.06      B   3.07      C   1.08      C   2.09      C   2.010     C   2.011     C   3.0

郎朗坤

假设“Alpha”列已排序,您可以这样做df["Beta"] = 2df.loc[~(df["Alpha"] == df["Alpha"].shift()), "Beta"] = 1df.loc[~(df["Alpha"] == df["Alpha"].shift(-1)), "Beta"] = 3df

米琪卡哇伊

方法一使用np.select:mask1=df['Alpha'].ne(df['Alpha'].shift())mask3=df['Alpha'].ne(df['Alpha'].shift(-1))mask2=~(mask1|mask3)cond=[mask1,mask2,mask3]values=[1,2,3]df['Beta']=np.select(cond,values)print(df)   Alpha  Beta0      A     11      A     22      A     33      B     14      B     25      B     26      B     37      C     18      C     29      C     210     C     211     C     3条件列表的详细信息:print(mask1)0      True1     False2     False3      True4     False5     False6     False7      True8     False9     False10    False11    FalseName: Alpha, dtype: boolprint(mask2)0     False1      True2     False3     False4      True5      True6     False7     False8      True9      True10     True11    FalseName: Alpha, dtype: boolprint(mask3)0     False1     False2      True3     False4     False5     False6      True7     False8     False9     False10    False11     TrueName: Alpha, dtype: bool方法二使用groupby: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  Beta0     A     11     A     22     A     30     B     11     B     22     B     23     B     30     C     11     C     22     C     23     C     24     C     3
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python