给值分配一个组

时间:2018-08-08 12:55:29

标签: python pandas dataframe

我有一个熊猫数据框,其中有几列(20)和几行(16404)。一列是['age']。我希望能够按年龄类别绘制其他指标,例如['收入']。 例如:所有20岁以下的男性或20岁至40岁的女性的收入是多少。

我尝试过这种情况:

for i in range(len(df['age'])):
    if df['age'][i]<25 and df['Gender'][i]==1:
        df['group'][i]=1

但是出现以下错误:The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

能否请您告诉我如何根据这些条件将组分配给行?

所有系列都是int64

最佳

3 个答案:

答案 0 :(得分:2)

  1. 模棱两可的错误可以通过(df['age'] < 25) & (df['Gender'] == 1)解决,请注意,我使用的是&而不是and
  2. 如果这样做,您将评估整个列,并为每一行分配整个列,这非常浪费。

执行此操作以获取布尔值

df['group'] = df['age'].lt(25) & df['Gender'].eq(1)

您可以通过多种方式将其转换为整数01

df['group'] = df['group'].astype(int)

答案 1 :(得分:1)

cond_1 = df['age'] < 25
cond_2 = df['Gender'] == 1
df['group'] = np.where(cond_1 & cond_2, 1, 0)

它将在两个条件都满足的情况下分配1,在其他任何地方都分配0

考虑到您的评论,此方法不必是二进制的。您可以根据需要包含任意数量的条件,并且可以用1替换所需的任何int或str。此外,您可以将0更改为np.nan

答案 2 :(得分:1)

您应该改用apply方法(请参见doc):

def your_function(row):
    if row['age']<25 and row['Gender']==1:
        return 1
    else: return 0

df['group'] = df.apply(your_function,axis=1)