我有一个包含15列和大约17000行的csv文件。 我的问题是在特定列(例如:“名称”列)中搜索输入字符串,如果匹配,则打印包含字符串的行[i],上一行[i-1]和下一行[i + 1]行,按i-1,i,i + 1的顺序排列。重复此过程,直到该列的最后一个元素为止(我的数据文件已格式化,因此其中没有重复的内容)。
我使用此reference查找行,程序运行良好。下面是我的python代码:
import pandas as pd
x = input('Please input the name: ')
df = pd.read_csv("input.csv", sep = ",")
idx = df[df.name.str.contains(x, na=False)].index.tolist()
for i in idx:
print(df.iloc[[i-1, i, i+1]])
我想问一下如何将上面过滤的数据导出到一个新的数据框中,并输出到一个新的csv文件中?我遵循以下reference:
df.iloc[[i-1, i, i+1]].to_csv('result.csv', index=True, mode='a')
输出文件还可以,但其中不包含各列的名称,根据主题的作者,我也认为它不是那么正式和最佳。
非常感谢您。
答案 0 :(得分:0)
您可以尝试以下方法:
tmp = pd.DataFrame() # A blank dataframe
for i in idx:
tmp.append(df.iloc[[i-1, i, i+1]]) # Keep appending the rows to the tmp df
然后,将列名称分配给tmp
tmp.columns = df.columns
将此内容写入csv:
tmp.to_csv('result.csv', index=True)
让我知道这是否有帮助。
答案 1 :(得分:0)
我认为您需要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列表,然后以无模式append
保存到csv:
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')