亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

熊貓列基于其他列中的值

熊貓列基于其他列中的值

MMTTMM 2021-05-13 17:10:49
基本上,我想在“ Discount_Sub_Dpt”列中填入“是”或“否”,具體取決于那一周該Sub_Dpt是否有折扣,但該行所登陸的產品除外(例如,我不需要任何逐行考慮A在該周是否有折扣,而僅對該子部門中的產品有折扣(在大多數情況下,還有其他多個產品)。我試過使用groupby和Sub_Dpt和Week無濟于事。有誰知道如何解決這個問題?黃色列顯然是代碼的理想結果。這是我使用過的一些代碼,我試圖首先創建該列,然后更新值(但是可能都錯了)(我還故意將其命名為數據幀df1):  df1['Discount_Sub_Dpt'] = np.where((df1['Discount']=='Yes'),'Yes','No') grps = []                     grps.append(df1.Sub_Dpt.unique()) for x in grps:      x = str(x)      yes_weeks = df1.loc[(df1.Discount_SubDpt == 'Yes') & (df1.Sub_Dpt_Description == x),'Week'].unique()          df1.loc[df1['Week'].isin(yes_weeks) & df1['Sub_Dpt_Description'] == x, 'Discount_SubDpt'] = 'Yes'
查看完整描述

3 回答

?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

當Discount為“ Yes”時,您可以執行GroupBy映射('Week', 'Sub_Dpt')到的列表'Product'。


然后使用列表推導來檢查是否有折扣產品存在問題。最后,將布爾序列結果映射到“是” /“否”。


來自@SahilPuri的數據。


# GroupBy only when Discount == Yes

g = df1[df1['Discount'] == 'Yes'].groupby(['Week', 'Sub_Dpt'])['Product'].unique()


# calculate index by row

idx = df1.set_index(['Week', 'Sub_Dpt']).index


# construct list of Booleans according to criteria

L = [any(x for x in g.get(i, []) if x!=j) for i, j in zip(idx, df1['Product'])]


# map Boolean to strings

df1['Discount_SubDpt'] = pd.Series(L).map({True: 'Yes', False: 'No'})


print(df1)


   Product  Week Sub_Dpt Discount Discount_SubDpt

0        A     1    Toys      Yes              No

1        A     2    Toys       No             Yes

2        A     3    Toys       No              No

3        A     4    Toys      Yes             Yes

4        B     1    Toys       No             Yes

5        B     2    Toys      Yes              No

6        B     3    Toys       No              No

7        B     4    Toys      Yes             Yes

8        C     1   Candy       No              No

9        C     2   Candy       No              No

10       C     3   Candy      Yes              No

11       C     4   Candy      Yes              No

12       D     1   Candy       No              No

13       D     2   Candy       No              No

14       D     3   Candy       No             Yes

15       D     4   Candy       No             Yes


查看完整回答
反對 回復 2021-05-18
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

好的,這可能無法很好地擴展,但應該易于閱讀。


df1 = pd.DataFrame(data= [[ 'A',    1,  'Toys', 'Yes',  ],

[   'A',    2,  'Toys', 'No',   ],

[   'A',    3,  'Toys', 'No',   ],

[   'A',    4,  'Toys', 'Yes',  ],

[   'B',    1,  'Toys', 'No',   ],

[   'B',    2,  'Toys', 'Yes',  ],

[   'B',    3,  'Toys', 'No',   ],

[   'B',    4,  'Toys', 'Yes',  ],

[   'C',    1,  'Candy',    'No',   ],

[   'C',    2,  'Candy',    'No',   ],

[   'C',    3,  'Candy',    'Yes',  ],

[   'C',    4,  'Candy',    'Yes',  ],

[   'D',    1,  'Candy',    'No',   ],

[   'D',    2,  'Candy',    'No',   ],

[   'D',    3,  'Candy',    'No',   ],

[   'D',    4,  'Candy',    'No',   ],], columns=['Product', 'Week', 'Sub_Dpt',        'Discount'])

df2 = df1.set_index(['Product', 'Week', 'Sub_Dpt'])

products = df1.Product.unique()

df1['Discount_SubDpt'] = df1.apply(lambda x: 'Yes' if 'Yes' in df2.loc[(list(products[products != x['Product']]), x['Week'], x['Sub_Dpt']), 'Discount'].tolist() else 'No', axis=1)

第一步創建一個Multindex數據框。


接下來,我們獲得所有產品的清單


接下來,對于每一行,我們取出同一周和子部門并刪除產品。


在此列表中,如果有折扣,我們選擇“是”,否則選擇“否”


編輯1:


如果您不想創建另一個數據框(節省內存,但是會慢一些)


df1['Discount_SubDpt'] = df1.apply(lambda x: 'Yes' if 'Yes' in df1.loc[(df1['Product'] != x['Product']) & (df1['Week'] == x['Week']) & (df1['Sub_Dpt'] == x['Sub_Dpt']), 'Discount'].tolist() else 'No', axis=1)



查看完整回答
反對 回復 2021-05-18
  • 3 回答
  • 0 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號