3 回答

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(應刪除)的行存在。

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的完整答案將顯示如何操作。

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)
添加回答
舉報