假设我有这个最小的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?
答案 0 :(得分:1)
我将使用transform
,all
和ffill
:
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