繁体   English   中英

根据 Pandas 中不同行的其他列中的值比较将值应用于列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM