标签值取决于多列条件

时间:2019-03-22 17:30:14

标签: python pandas dataframe

假设我有这个最小的DataFrame可以满足我的需求:

    Tag   Year   Month   Snowed 
0    0    2001    Jan     True
1    0    2001    Feb     False 
2    0    2001    Mar     True
3    0    2002    Jan     True
4    0    2002    Feb     True
5    0    2002    Mar     False

我该如何填充“标记”列,以便如果在1月和2月或“好”期间都下雪,则每年将其标记为BAD?

2 个答案:

答案 0 :(得分:1)

我将使用transformallffill

df['Tage']=df.loc[df.Month.isin(['Jan','Feb'])].groupby('Year')['Snowed'].transform('all').map({False:'Good',True:'Bad'})
df.ffill(inplace=True)
df
Out[262]: 
   Tag  Year Month  Snowed  Tage
0    0  2001   Jan    True  Good
1    0  2001   Feb   False  Good
2    0  2001   Mar    True  Good
3    0  2002   Jan    True   Bad
4    0  2002   Feb    True   Bad
5    0  2002   Mar   False   Bad

s=df.loc[df.Month.isin(['Jan','Feb'])].groupby('Year')['Snowed'].agg('all').map({False:'Good',True:'Bad'})

然后map返回

df['Tage']=df.Year.map(s)

答案 1 :(得分:0)

除了上述答案外,这也适用。这段代码可能不太混乱。

由于我们不关心您所提出问题的3月数据: df = df[(df.Month != 'Mar')]

def True_Or_Not(df):
    Result = df['Snowed'].all(axis=None) == True
    df['Result'] = Result
    return df

“分组年份”和“汇总月份”列可确定所有值是否均为真

df  = df.groupby(['Year']).apply(lambda df: True_Or_Not(df)).reset_index().drop(columns = ['index'])
df['Tag'] = ['Good' if i== False else 'Bad' for i in df.Result.tolist()]

输出:

    Tag     Year    Month   Snowed  Result
0   Good    2001    Jan    True     False
1   Good    2001    Feb    False    False
2   Bad     2002    Jan    True     True
3   Bad     2002    Feb    True     True