熊猫-查找一些特定的行,并将过滤后的数据帧输出到新的CSV文件中

时间:2018-11-06 07:58:07

标签: python pandas csv dataframe

我有一个包含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')

输出文件还可以,但其中不包含各列的名称,根据主题的作者,我也认为它不是那么正式和最佳。

非常感谢您。

2 个答案:

答案 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)

我认为您需要minmax以避免选择在第一行和最后一个匹配行之前和之后都不存在的行,然后对于新文件,首先仅保存列名,然后在循环中仅保存不包含的数据标头:

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')