pandas 对 Dataframe 的列中的变化进行分类

2guxujil  于 2023-03-16  发布在  其他
关注(0)|答案(1)|浏览(154)

我有以下 Dataframe ,其中已经按日期和客户排序。当“出现”列为1时,这是客户第一次出现在 Dataframe 中。
我想创建一个名为“ActOwner”的新列,我将在其中放置3个代码来通知当前所有者。

  • 如果它为0,则在Appear = 1时,它被视为原始所有者。
  • 当所有者发生更改时,“ActOwner”的值必须为1
  • 当返回到原始所有者时,“ActOwner”的值为2。

这是我的示例 Dataframe :
| 日期|所有人|客户|出现|
| - ------|- ------|- ------|- ------|
| 2022年7月31日|八一零|A类|1个|
| 2022年8月31日|八一一|A类|无|
| 2022年9月30日|八一一|A类|无|
| 2022年10月31日|八一零|A类|无|
| 2022年11月30日|八一二|A类|无|
| 二○二二年十二月二十九日|八一零|A类|无|
| 2023年1月12日|八一零|A类|无|
| 2022年3月31日|七四八|B|1个|
| 2022年4月30日|七四八|B|无|
| 2022年5月31日|七四九|B|无|
| 2022年6月30日|七四九|B|无|
| 2022年7月31日|七四八|B|无|
| 2022年8月31日|八一零|C级|1个|
| 2022年9月30日|八一零|C级|无|
| 2022年10月31日|八一零|C级|无|
| 2022年11月30日|八一一|C级|无|
| 二○二二年十二月二十九日|八一二|C级|无|
| 2023年1月12日|八一零|C级|无|
这是我预期的结果:
| 日期|所有人|客户|出现|实际所有者|
| - ------|- ------|- ------|- ------|- ------|
| 2022年7月31日|八一零|A类|1个|无|
| 2022年8月31日|八一一|A类|无|1个|
| 2022年9月30日|八一一|A类|无||
| 2022年10月31日|八一零|A类|无|第二章|
| 2022年11月30日|八一二|A类|无|1个|
| 二○二二年十二月二十九日|八一零|A类|无|第二章|
| 2023年1月12日|八一零|A类|无||
| 2022年3月31日|七四八|B|1个|无|
| 2022年4月30日|七四八|B|无||
| 2022年5月31日|七四九|B|无|1个|
| 2022年6月30日|七四九|B|无||
| 2022年7月31日|七四八|B|无|第二章|
| 2022年8月31日|八一零|C级|1个|无|
| 2022年9月30日|八一零|C级|无||
| 2022年10月31日|八一零|C级|无||
| 2022年11月30日|八一一|C级|无|1个|
| 二○二二年十二月二十九日|八一二|C级|无|1个|
| 2023年1月12日|八一零|C级|无|第二章|
你们能帮我建一个新的栏目“ActOwner”吗?谢谢

mwkjh3gx

mwkjh3gx1#

用途:

#test if Appear equal 1 
m1 = df['Appear'].eq(1)
#test if Owner per groups by Customer is same if Appear equal 1 
m2 = df['Owner'].eq(df['Customer'].map(df.loc[m1].set_index('Customer')['Owner']))
#test consecutive Owners
m3 = df['Owner'].ne(df['Owner'].shift())

#set final codes
df['ActOwner'] = np.select([~m3, m1, m2 & ~m1], [np.nan, 0, 2], default=1)
print (df)
          date  Owner Customer  Appear  ActOwner
0   31/07/2022    810        A       1       0.0
1   31/08/2022    811        A       0       1.0
2   30/09/2022    811        A       0       NaN
3   31/10/2022    810        A       0       2.0
4   30/11/2022    812        A       0       1.0
5   29/12/2022    810        A       0       2.0
6   12/01/2023    810        A       0       NaN
7   31/03/2022    748        B       1       0.0
8   30/04/2022    748        B       0       NaN
9   31/05/2022    749        B       0       1.0
10  30/06/2022    749        B       0       NaN
11  31/07/2022    748        B       0       2.0
12  31/08/2022    810        C       1       0.0
13  30/09/2022    810        C       0       NaN
14  31/10/2022    810        C       0       NaN
15  30/11/2022    811        C       0       1.0
16  29/12/2022    812        C       0       1.0
17  12/01/2023    810        C       0       2.0

相关问题