为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

三国纷争 2022-06-28 11:11:04
假设我按如下方式导入 pandas 和 numpy:import pandas as pdimport numpy as np并构建以下数据框:df = pd.DataFrame({'Alpha' ['A','A','A','B','B','B','B','C','C','C','C','C'],'Beta' : np.NaN})...这给了我这个:    Alpha  Beta0      A   NaN1      A   NaN2      A   NaN3      B   NaN4      B   NaN5      B   NaN6      B   NaN7      C   NaN8      C   NaN9      C   NaN10     C   NaN11     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  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一般来说,我想要实现的目标可以用以下逻辑来描述:假设我们将 df 按 Alpha 分组。对于每个组,对于组中的每一行......如果行的索引等于组中行的最小索引,则将该行的 Beta 赋值为 1,否则,如果行的索引等于组中行的最大索引,则为该行分配 3 到 Beta,否则将 2 分配给该行的 Beta。
查看完整描述

3 回答

?
德玛西亚99

TA贡献1770条经验 获得超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


查看完整回答
反对 回复 2022-06-28
?
郎朗坤

TA贡献1921条经验 获得超9个赞

假设“Alpha”列已排序,您可以这样做


df["Beta"] = 2

df.loc[~(df["Alpha"] == df["Alpha"].shift()), "Beta"] = 1

df.loc[~(df["Alpha"] == df["Alpha"].shift(-1)), "Beta"] = 3

df


查看完整回答
反对 回复 2022-06-28
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

方法一


使用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  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

条件列表的详细信息:


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

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

方法二


使用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  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


查看完整回答
反对 回复 2022-06-28
  • 3 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信