迭代DataFrame,评估列值,并将值设置为第三列

时间:2017-07-26 22:07:19

标签: python pandas dataframe iterable

我一直在尝试迭代DataFrame或应用函数,以便根据DataFrame中的其他2个列更改DataFrame特定列中的内容。

我有一个像:

df = pd.DataFrame({'Age_type' : pd.Series(['Adult','Adult','Child','Child']),
     'Gender' : pd.Series(['Female','Male','Female','Female'])
     })

   Gender  Age_type  Group
0  Female  Adult
1  Male    Adult
2  Female  Child
3  Female  Child

我想为每个案例设置一个小组,并提出这个想法:

if gender == 'Female' and age_type == 'Adult': 
   group = 'Group A'
elif gender == 'Female' and age_type == 'Child':
   group = 'Group B'
elif gender == 'Male' and age_type == 'Adult':
   group = 'Group C'
elif gender == 'Male' and age_type == 'Child':
   group = 'Group D'

我试过使用.apply(function),因为据我所知,你不应该在迭代时修改DataFrame(所以这会使for循环不是一个选项¿?)。

我试过了:

def set_group(data):
    gender = data['Gender']
    age_type = data['Age_type']
    if gender == 'Female' and age_type == 'Adult': 
       data['Group'] = 'Group A'
    elif gender == 'Female' and age_type == 'Child':
       data['Group'] = 'Group B'
    elif gender == 'Male' and age_type == 'Adult':
       data['Group'] = 'Group C'
    elif gender == 'Male' and age_type == 'Child':
       data['Group'] = 'Group D'
    return None

df['Group'].apply(set_group)

但我一直收到如下错误: TypeError:字符串索引必须是整数,而不是str

有关如何迭代DataFrame的任何想法,读取一些列,并基于此,设置另一列的值?

谢谢!

2 个答案:

答案 0 :(得分:4)

这个怎么样?

In [96]: df
Out[96]:
  Age_type  Gender
0    Adult  Female
1    Adult    Male
2    Child  Female
3    Child  Female

In [97]: m = {'FemaleAdult': 'Group A',
    ...:  'FemaleChild': 'Group B',
    ...:  'MaleAdult': 'Group C',
    ...:  'MaleChild': 'Group D'}

In [98]: df['group'] = (df.Gender + df.Age_type).map(m)

In [99]: df
Out[99]:
  Age_type  Gender    group
0    Adult  Female  Group A
1    Adult    Male  Group C
2    Child  Female  Group B
3    Child  Female  Group B

答案 1 :(得分:1)

试试这个:

dfx['group'] = ""
dfx['group'] = np.where((dfx['Gender']=='Female')&(dfx['Age_type']=='Adult'),'A', dfx['group'])
dfx['group'] = np.where((dfx['Gender']=='Female')&(dfx['Age_type']=='Child'),'B', dfx['group'])
dfx['group'] = np.where((dfx['Gender']=='Male')&(dfx['Age_type']=='Adult'),'C', dfx['group'])
dfx['group'] = np.where((dfx['Gender']=='Male')&(dfx['Age_type']=='Child'),'D', dfx['group'])