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

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

簡化代碼。我的作品,但看起來像地獄一樣丑陋

簡化代碼。我的作品,但看起來像地獄一樣丑陋

慕少森 2022-08-11 17:42:54
我在處理Python時遇到了麻煩。我有PD數據幀,我需要刪除所有行,這些行是在特定值之后(在代碼值中寫入稱為年份的列表)所有值都應按公司名稱分組,因為這些obserevation屬于“inn_main”列中提到的公司。我真的不明白如何使用Pandas功能做到這一點。我找到了一種方法,但它非常丑陋,效率不高。import pandas as pd data = {'inn_main':['Apple', 'Apple', 'Apple', 'Apple', 'Tesla', 'Tesla', 'Tesla'], 'Help':['OK', 'OK', 2013, 'OK','OK', 2014, 'OK']} df = pd.DataFrame(data) droper=[]block=0years=[2012,2013,2014,2015,2016,2017,2018]for j in range(len(list(df['Help'].groupby(df['inn_main'])))):    alarm=0    for i in range(len(list(df['Help'].groupby(df['inn_main']))[j][1].index.values)):        if list(df['Help'].groupby(df['inn_main']))[j][1][list(df['Help'].groupby(df['inn_main']))[j][1].index.values[i].astype(int)] in years:            block=1            alarm=1        if block==1:            block=0        else:            if alarm==1:                droper.append(list(df['Help'].groupby(df['inn_main']))[j][1].index.values[i].astype(int))   df.drop(index=droper)你能告訴我我到底做錯了什么嗎?有什么捷徑嗎?
查看完整描述

3 回答

?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

解決方案出奇地短:


df.groupby('inn_main').apply(lambda grp:

    grp[~grp.Help.isin(years).cumsum().shift(fill_value=0).astype(bool)])

結果是:


           inn_main  Help

inn_main                 

Apple    0    Apple    OK

         1    Apple    OK

         2    Apple  2013

Tesla    4    Tesla    OK

         5    Tesla  2014

詳:

  • df.groupby('inn_main')- 按公司對數據幀進行分組。

  • apply(lambda grp:- 將 lambda 函數應用于每個組。

  • grp.Help.isin(years)幫助是否以年為單位有價值?

  • .cumsum()- 上述問題的累計總和。

  • shift(fill_value=0)- 將結果向下移動1行,用0填充任何NaN(實際上是第一項)。

  • astype(bool)- 將整數轉換為布爾

  • ~- 否定上述結果

  • [...]- 在布爾索引中使用上述結果。

  • grp[...]- 從當前組返回“好”行(它們將是當前組的結果的一部分)。

注意ASGM 的解決方案僅刪除第一行,在包含“幫助”的任何行之后,第一行“確定”。

要確認這一點,請將另一行包含 Tesla 和 OK 添加到 DataFrame 并運行他的代碼。

結果是:

  inn_main  Help

0    Apple    OK

1    Apple    OK

2    Apple  2013

4    Tesla    OK

5    Tesla  2014

7    Tesla    OK

因此,索引 == 7(應刪除)的行存在。


查看完整回答
反對 回復 2022-08-11
?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

我不完全理解你的要求,但這就是我認為你想要的。給定以下數據幀...


   Help inn_main

0    OK    Apple

1    OK    Apple

2  2013    Apple

3    OK    Apple

4    OK    Tesla

5  2014    Tesla

6    OK    Tesla

...您希望標識 列表中的每一行,并刪除其后面的行(在屬于給定公司的行中)。如果這是正確的,你可以做得更簡單:df.Helpyears


years = range(2012, 2019)

df[~df.groupby('inn_main')['Help'].apply(lambda g: g.isin(years).shift().fillna(False))]

這將提供:


   Help inn_main

0    OK    Apple

1    OK    Apple

2  2013    Apple

4    OK    Tesla

5  2014    Tesla

如果要刪除公司內給定行后面的所有行,Valdi_Bo的完整答案將顯示如何操作。


查看完整回答
反對 回復 2022-08-11
?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

我不太了解panda,也不知道你想做什么,但這里是重構的代碼,用于迭代列表而不是使用索引:


import pandas as pd 

data = {'inn_main':['Apple', 'Apple', 'Apple', 'Apple', 'Tesla', 'Tesla', 'Tesla'], 'Help':['OK', 'OK', 2013, 'OK','OK', 2014, 'OK']} 

df = pd.DataFrame(data) 

droper=[]

years=[2012,2013,2014,2015,2016,2017,2018]

for j in list(df['Help'].groupby(df['inn_main'])):

    alarm=False

    for i in j[1].index.values:

        if j[1][i.astype(int)] in years:

            alarm=True

        elif alarm:

            droper.append(i.astype(int))   

df.drop(index=droper)


查看完整回答
反對 回復 2022-08-11
  • 3 回答
  • 0 關注
  • 122 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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