3 回答

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
解決方案出奇地短:
df.groupby('inn_main').apply(lambda grp:
grp[~grp.Help.isin(years).cumsum().shift(fill_value=0).astype(bool)])
結(jié)果是:
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')
- 按公司對(duì)數(shù)據(jù)幀進(jìn)行分組。apply(lambda grp:
- 將 lambda 函數(shù)應(yīng)用于每個(gè)組。grp.Help.isin(years)
- 幫助是否以年為單位有價(jià)值?.cumsum()
- 上述問(wèn)題的累計(jì)總和。shift(fill_value=0)
- 將結(jié)果向下移動(dòng)1行,用0填充任何NaN(實(shí)際上是第一項(xiàng))。astype(bool)
- 將整數(shù)轉(zhuǎn)換為布爾。~
- 否定上述結(jié)果[...]
- 在布爾索引中使用上述結(jié)果。grp[...]
- 從當(dāng)前組返回“好”行(它們將是當(dāng)前組的結(jié)果的一部分)。
注意:ASGM 的解決方案僅刪除第一行,在包含“幫助”的任何行之后,第一行“確定”。
要確認(rèn)這一點(diǎn),請(qǐng)將另一行包含 Tesla 和 OK 添加到 DataFrame 并運(yùn)行他的代碼。
結(jié)果是:
inn_main Help
0 Apple OK
1 Apple OK
2 Apple 2013
4 Tesla OK
5 Tesla 2014
7 Tesla OK
因此,索引 == 7(應(yīng)刪除)的行存在。

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊
我不完全理解你的要求,但這就是我認(rèn)為你想要的。給定以下數(shù)據(jù)幀...
Help inn_main
0 OK Apple
1 OK Apple
2 2013 Apple
3 OK Apple
4 OK Tesla
5 2014 Tesla
6 OK Tesla
...您希望標(biāo)識(shí) 列表中的每一行,并刪除其后面的行(在屬于給定公司的行中)。如果這是正確的,你可以做得更簡(jiǎn)單: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
如果要?jiǎng)h除公司內(nèi)給定行后面的所有行,Valdi_Bo的完整答案將顯示如何操作。

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊
我不太了解panda,也不知道你想做什么,但這里是重構(gòu)的代碼,用于迭代列表而不是使用索引:
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)
添加回答
舉報(bào)