[英]Applying values to a column based on value comparison in other columns across different rows in Pandas
我已经在互联网上搜索了我的问题,但没有完全相同。 我是 Pandas 的新手。
我有一个巨大的 dataframe,大约 800K 行。 在 800K 行中,其中 200K 是重复的,表示在同一个 SSN 下拥有多辆汽车的车主(由于拼写等原因可能有不同的名称)。 例如,下面是我的 dataframe。
SSN 是确定他们是同一个人的关键,尽管名称可能不同(或略有不同):
SSN_ID Name Registration_Number Brand Car Year Eligible Status Channel
00001 Baron Zemo SKV2017 Toyota 86 2020 1 2 Call
00001 Baron Zimo SKV1999 Subaru BRZ 2012 1 0 Call
00002 Steve Rogers SHD2012 Cadillac deVille 1970 1 0 Call
00003 Bucky Barnes MTL9841 Ford Boss 429 1970 1 0 Call
00004 Tony Stark IRN0007 Audi R8 2013 1 1 Apps
00005 Wanda Maximoff SCR1080 Hyundai i-30N 2020 1 1 Apps
00004 Tony Stank ILY3000 Audi e-Tron GT 2020 1 0 Call
00001 Beron Zemo SKV0800 Audi TT-RS 2018 1 1 Apps
“渠道”栏是进行保险促销广告的渠道,“状态”栏是客户参与的状态。
'Status' = 0, No call attempted
'Status' = 1, Answered, rejected/accepted the offer
'Status' = 2, Unanswered, line busy/not pick-up
以前,呼叫和促销是根据每辆车进行的,因此会提示一个车主被多次呼叫,每辆车一次呼叫的情况。 例如上面,Zemo 男爵将在不同的时间/天为他的每辆车调用 3 次,因为他拥有 3 辆车。 但现在,管理层希望确保每个车主只被叫一次,尽管他们拥有多辆汽车。
我想根据“状态”列值更新 dataframe 中的“通道”列。 逻辑应该是这样的:
If 'Status' == 0 or 2, df[Channel] = 'Call'
If 'Status' == 1, df[Channel] = 'Apps'
但问题是,拥有多辆汽车的车主在各行中有多个“状态”。 以 Zemo (SSN_ID: 00001) 和 Stark (SSN_ID: 00004) 为例。 他们对“状态”列有多个值,因为他们拥有多辆汽车。 因此,我还需要根据其他行的“状态”值更新“通道”列。
使用.loc
,我可以将 dataframe 分成 2 个,1 个用于拥有多辆车的所有者,1 个用于拥有 1 辆车的所有者。
df1= df.loc[df.duplicated(subset=['SSN_ID'], keep=False)].sort_values(by='SSN_ID', ascending=True)
df2= df.loc[~(df.duplicated(subset=['SSN_ID'], keep=False))]
df1 如下:
SSN_ID Name Registration_Number Brand Car Year Eligible Status Channel
00001 Baron Zemo SKV2017 Toyota 86 2020 1 2 Call
00001 Baron Zimo SKV1999 Subaru BRZ 2012 1 0 Call
00001 Beron Zemo SKV0800 Audi TT-RS 2018 1 1 Apps
00004 Tony Stark IRN0007 Audi R8 2013 1 2 Apps
00004 Tony Stank ILY3000 Audi e-Tron GT 2020 1 0 Call
Eventho Zemo 有 3 个状态(2,0,1),但由于我们在他的奥迪 TT-RS 上调用了 Zemo('Status'== 1)并且他已经拒绝了这个提议,我们不应该再打电话给他了(eventho他有 2 辆其他汽车),因此,“频道”列将分配给“应用程序”。
至于 Stark,他有 2 个状态(2,0),因为他没有接听电话('Status' == 2),我们会继续尝试给他打电话,直到他接听并拒绝或接受这个提议,因此,“频道”列将分配给“呼叫”。
但是,我不知道如何从上面应用这些逻辑。
df1 的最终预期结果如下所示:
SSN_ID Name Registration_Number Brand Car Year Eligible Status Channel
00001 Baron Zemo SKV2017 Toyota 86 2020 1 2 Apps
00001 Baron Zimo SKV1999 Subaru BRZ 2012 1 0 Apps
00001 Beron Zemo SKV0800 Audi TT-RS 2018 1 1 Apps
00004 Tony Stark IRN0007 Audi R8 2013 1 2 Call
00004 Tony Stank ILY3000 Audi e-Tron GT 2020 1 0 Call
有没有办法跨行进行比较,并且只正确更新“通道”列的值,而不更改 dataframe 形状(因为其他东西仍然需要它)?
太感谢了。
免责声明:我知道如果 dataframe 的焦点基于 SSN_ID 而不是 Car/Registration 号码,会更容易,但这是用于数据操作的做法。
希望这将帮助您入门。 这应该为您提供您正在寻找的channel
列。
d = {0:'Call',
1:'Apps'}
df['Channel'] = df['Status'].eq(1).groupby(df['SSN_ID']).transform('any').astype(int).map(d)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.