我正在使用以下代码进行分组计算。
**Input**
ORG DSTN FLAG
LON SIN Y
ADL SIN N
SIN LON N
LON SIN Y
LON SIN N
ADL SIN Y
ADL SIN N
SIN LON Y
SIN LON Y
SIN LON Y
SIN LON N
LON SIN N
我的代码
data.assign(Lane_Score=data.groupby(['ORIGIN_CITY','DEST_CITY']).Delay_Flag.apply(lambda x:x.replace('YES|NO',(x=='YES').mean(),regex=True)))
我得到的输出是因为它没有附加到数据框上。当我尝试单独提取该列时,它不起作用。
data['Lane_Score']
如何解决此问题。
答案 0 :(得分:1)
尝试一下:
data['Lane_Score'] = data.groupby(['ORIGIN_CITY','DEST_CITY']).Delay_Flag.apply(lambda x:x.replace('YES|NO',(x=='YES').mean(),regex=True)))
答案 1 :(得分:1)
根据熊猫文档DataFrame.assign
关键字是列名。如果这些值是可调用的,则它们将在DataFrame上计算并分配给新列。 可调用对象不得更改输入DataFrame(尽管pandas不会对其进行检查)。如果值不可调用(例如,Series,标量或数组),则将它们简单分配。
因此,您需要将其分配给原始df或使用显式的常规分配,也不需要replace
和transform
:
df['Lane_Score'] = df.groupby(['ORG','DSTN']).FLAG.transform(lambda x: (x=='Y').mean())
或更快速的方法是:
df['Lane_Score'] = df['FLAG']=='Y'
df['Lane_Score'] = df.groupby(['ORG','DSTN']).Lane_Score.transform('mean')
或者:
df = df.assign(Lane_Score=df.groupby(['ORG','DSTN']).FLAG.apply(lambda x: x.replace('Y|N',(x=='Y').mean(),regex=True)))
print(df)
ORG DSTN FLAG Lane_Score
0 LON SIN Y 0.500000
1 ADL SIN N 0.333333
2 SIN LON N 0.600000
3 LON SIN Y 0.500000
4 LON SIN N 0.500000
5 ADL SIN Y 0.333333
6 ADL SIN N 0.333333
7 SIN LON Y 0.600000
8 SIN LON Y 0.600000
9 SIN LON Y 0.600000
10 SIN LON N 0.600000
11 LON SIN N 0.500000