1

我是编程新手,我有一堆 CSV 文件,每个文件大约 50 到 60 行。在未指定数量的行之后,第二列中有一个名为“NAME”的字符串。我想在“NAME”之后的第二列中获取所有内容并将其打印到文本文件中。我最初想使用pandasskiprows执行此操作,但问题是我运行的每个 csv 都会在不同的行中有“NAME”。此外,如果有帮助,每个 CSV 中的“NAME”前三行都有一个空行。

header, header   
header, header                           
NUMBER,ITEM
N1,Shoe
N2,Heel
N3,Tee, random stuff
N4,Polo, random stuff
N5,Sneaker
N10,Heel
N11,Tee
...
...
...

How         
Count   17      
SORT,NAME       
H1,Thing, random stuff   
H2,WTANK        
H3,TEE2  
H4,TEE  

我也希望文本文件中没有重复,因为我将在一个目录中运行大约 1000 个 CSV。这是我开始使用的一些代码,也是我卡住的地方。

import pandas as pd
import csv
import glob

fns = glob.glob('*.csv') #goes through every CSV file in director
for csv in fns:
    prod_df = pd.read_csv(csv, skiprows=???)
    with open (os.path.join('out', fn), 'wb') as f:
        w = csv.writer(f)
        test_alias = prod_df['NAME'].unique()
        w.writerow(row) 

我知道它不起作用,并且可能不是一个很好的代码。任何帮助将不胜感激。谢谢你!

4

2 回答 2

1

假设NAME只发生一次你可以使用get_loc

import pandas as pd
import glob

fn = 'out.csv'
fns = glob.glob('*.csv') #goes through every CSV file in director
colname = 'ITEM'
rowname = 'NAME'
for csv in fns:
    s = pd.read_csv(csv, usecols=[colname], squeeze=True, skiprows=7, header=0)
    row_idx = pd.Index(s).get_loc(rowname)
    sub_items = s[row_idx + 1:]
    pd.Series(sub_items.unique()).to_csv(fn, mode='a')

编辑:解释

usecols只读取您需要的列,即ITEM

squeeze=True返回一个Series

get_loc返回其参数的索引

你说你想要之后 'NAME'的一切,所以索引是row_idx + 1

mode='a'附加到单个 csv 文件(称为out.csv),如果您想写入单个csv 文件,那么您应该相应地调整您的代码

于 2013-08-20T21:32:35.570 回答
0

这是一种方式

import pandas as pd
import csv
import glob

fns = glob.glob('*.csv') #goes through every CSV file in director
for csv in fns:
    df = pd.read_csv(csv)
    row_idx = (df.ITEM == 'NAME').idxmax()
    sub_items = df.ITEM[row_idx:]
    sub_items.unique().to_csv(os.path.join('out', fn))
于 2013-08-20T21:30:53.390 回答