Я думаю, вам нужно min
и max
, чтобы избежать выбора несуществующей строки до первой и после последней совпавшей строки, затем для нового файла сначала сохраните только имена столбцов, а затем в цикле сохраните только данные без заголовка:
df = pd.DataFrame({
'A':list('abcdef'),
'B':[4,5,4,5,5,4],
'C':[7,8,9,4,2,3],
'D':[1,3,5,7,1,0],
'E':[5,3,6,9,2,4],
'name':list('aaabbb')
})
print (df)
#tested matching first row
x = 'a'
#tested matching last row
#x = 'b'
idx = df[df.name.str.contains(x, na=False)].index.tolist()
pd.DataFrame(columns=df.columns).to_csv('result.csv')
for i in idx:
df1 = df.iloc[[max(0, i-1), i, min(df.index[-1], i+1)]]
df1.to_csv('result.csv', index=False, mode='a', header=None)
#if need index values
#df1.to_csv('result.csv', mode='a', header=None)
Другим решением является использование concat
списка DataFrames, а затем сохранение в CSV без режима append
:
x = 'a'
idx = df[df.name.str.contains(x, na=False)].index.tolist()
dfs = []
for i in idx:
dfs.append(df.iloc[[max(0, i-1), i, min(df.index[-1], i+1)]])
#list comprehension alternative
#dfs = [df.iloc[[max(0, i-1), i, min(df.index[-1], i+1)]] for i in idx]
pd.concat(dfs).to_csv('result.csv', index=False)
#if need index
#pd.concat(dfs).to_csv('result.csv')