iT邦幫忙

0

python篩選問題

請問各位大神,關於python篩選的問題
ex
1.今天有一個欄位叫做合約狀態,裡面的值有欠費停約、欠費限制、生效和終止、遺失和強制停約
如果我想要抓不等於欠費停約、強制停約、終止,請問下面的方式是對的嗎
2.然後篩出來的條件想新增一行欄位叫"狀態"裡面的值是復約,最後在合併回DF裡面可以用什麼方法呢?卡一陣子了想不出來有什麼方式可以回貼....因為資料不方便貼上來所以沒po不好意思,希望能替小弟給方向~謝謝~
我的想法:
1.df3[(df3['合約狀態']!='欠費停約')&(df3['合約狀態']!='強制停約')&(df3['合約狀態']!='終止')] ps.我不要上述三個條件應該是用&沒錯吧...我知道也可以用==欠費限制 ==生效 ==遺失 但我想都練習看看
2.df3["狀態"]....然後就無想法了....

黃彥儒 iT邦高手 1 級 ‧ 2020-11-07 13:04:59 檢舉
你的程式碼沒出來…
rex655482 iT邦新手 5 級 ‧ 2020-11-08 16:17:55 檢舉
因為資料比較牽扯到隱私所以才沒放上去,只有寫簡短的想法而已抱歉
0
秋米苗
iT邦新手 5 級 ‧ 2020-11-08 00:58:07
  1. 使用反邏輯或正邏輯,重點在於閱讀性與維護性的問題,請使用良好程式構築
    1. 假設未來新增了新的合約狀態,該狀態該被歸類進去嗎?如果答案是否,請使用正邏輯。
    2. 正邏輯可以寫得更精簡,反邏輯可以寫得比這個漂亮。我跟PD不熟,請參考https://stackoverflow.com/questions/19960077/how-to-filter-pandas-dataframe-using-in-and-not-in-like-in-sql
  2. 這是DataFrame兄弟!你能做的就是新增欄位並給所有 row 附加預設值,然後再修正該欄位的值。或著簡單一點,當初資料進來時,就包含該欄位,只是都是預設值""或NaN,等到需要時再修改。
rex655482 iT邦新手 5 級 ‧ 2020-11-10 11:26:00 檢舉

了解!我本來想說可以直接貼上去 原來要本來就要有該欄位

0
Denny Chang
iT邦新手 4 級 ‧ 2020-11-08 10:50:26

問題2

#新增欄位
df['狀態']='複約'

#不確定你的問題是資料合併還是參照
import numpy as np
import pandas as pd
#合併=excel複製貼上
NEW = df.append(df2)

#參照=vlookup 針對指定欄位串接資料
右邊為主=pd.merge(data, data2, on='參照欄位', how='right')
左邊為主=pd.merge(data, data2, on='參照欄位', how='left')
取交集=pd.merge(data, data2, on='參照欄位', how='inner')
取聯集=pd.merge(data, data2, on='參照欄位', how='outer')

影片有更詳細的解說

rex655482 iT邦新手 5 級 ‧ 2020-11-08 16:22:30 檢舉

大大不好意思合併我懂,參照的意思是有點vlook up的感覺嗎,我要的就是有點vlook的感覺
大大上面的意思,我的理解是先做一個新的DF出來再並回去的意思嗎?
謝謝您的寶貴意見我會再嘗試的!

對喔 就是vlookup,但我不確定你是要交集還聯集,所以都貼出來。
對做個新的再併回去。

rex655482 iT邦新手 5 級 ‧ 2020-11-10 11:24:37 檢舉

了解 謝謝~

0
mackuo
iT邦新手 4 級 ‧ 2020-11-10 09:03:08

我來獻醜一下:

contracts_to_keep = ['欠費停約', '強制停約', '終止']
df3['狀態'] = ""

df3.loc[~df3['合約狀態'].isin(contracts_to_keep), '狀態'] = "復約"
看更多先前的回應...收起先前的回應...
rex655482 iT邦新手 5 級 ‧ 2020-11-10 11:23:00 檢舉

大大我發現有沒有lox好像都可以耶

rex655482 iT邦新手 5 級 ‧ 2020-11-10 11:23:11 檢舉

Loc

rex655482 iT邦新手 5 級 ‧ 2020-11-10 14:52:45 檢舉

~df3['合約狀態']請問這裡的~是什麼意思?

mackuo iT邦新手 4 級 ‧ 2020-11-10 17:00:55 檢舉

「~」是指反向的意思。

df3['合約狀態'].isin(contracts_to_keep)
是指合約狀態只要在['欠費停約', '強制停約', '終止']三種之一,就是True。

~df3['合約狀態'].isin(contracts_to_keep)
是指合約狀態不在['欠費停約', '強制停約', '終止']三種之一,才是True。

rex655482 iT邦新手 5 級 ‧ 2020-11-10 18:00:24 檢舉

學到了!之前在書上都沒看過!謝謝您~~~

rex655482 iT邦新手 5 級 ‧ 2020-11-10 18:11:38 檢舉

剛剛練習的時候突然一個恍然大悟!原來可以多一個list然後直接帶,太神啦!

mackuo iT邦新手 4 級 ‧ 2020-11-11 08:49:55 檢舉

很高興程式碼對您有幫助,一起加油!!

秋米苗 iT邦新手 5 級 ‧ 2020-11-11 19:00:52 檢舉

@rex655482
抓到!我貼的連結就是說明正反邏輯下用清單直接代的方法,結果你沒點開來看XD

rex655482 iT邦新手 5 級 ‧ 2020-11-12 09:20:23 檢舉

大大誤會阿~我有看,只是因為是英文有種怕怕的感覺XD所以沒有融會貫通,有中文似乎安心許多哈哈

我要發表回答

立即登入回答