有没有办法在创建熊猫数据框的同一行中使用if和for循环?

时间:2019-04-09 20:12:07

标签: python pandas dataframe

我在这里What is an acceptable way to discard the first couple lines of text?问了一个先前的问题,得到了两个有趣的答案,这使我重新思考如何解决该问题。除非循环通过熊猫数据框比循环通过一堆文本行慢得多,否则我认为没有理由不使用数据框。 我最初确定的代码是:

try:
    for year in range(start_year, current_year + 1):
        url = 'https://www.sec.gov/Archives/edgar/full-index/%s/%s/master.idx' %(year, quarter)
        r = requests.get(url)
        lines = r.text.splitlines(True)
        for line in lines[0:]:
            row = line.split('|')
            if len(row) == 5:
                cik, company_name, filling_type, filling_date, edgar_url = row[0:5]

except requests.exceptions.HTTPError as e:
    print(e)

但是,我认为最终用户可以更轻松地将熊猫用于其他方法(希望可以避免性能大幅下降)。我将代码更改为此:

df = pd.DataFrame()
try:
    for year in range(start_year, current_year + 1):
        url = 'https://www.sec.gov/Archives/edgar/full-index/%s/%s/master.idx' %(year, quarter)
        r = requests.get(url)
        lines = r.text.splitlines(True)
        for line in lines[0:]:
             row = line.split('|')
             if len(row) == 5:
                 df.append(row)
                 print(df.head(10))

我相信这会给我我想要的东西。但是,有一种方法可以将其缩短为:

df = pd.DataFrame()
try:
    for year in range(start_year, current_year + 1):
        url = 'https://www.sec.gov/Archives/edgar/full-index/%s/%s/master.idx' %(year, quarter)
        r = requests.get(url)
        lines = r.text.splitlines(True)
        df = pd.DataFrame([line.split('|') for line in lines if len(line.split('|') == 4])

我不能说我以前见过在数据框的构造函数中使用过if,尽管代码可以编译,但我似乎得到了一个空的数据框。我假设1)两次调用line.split('|')表示不返回任何行。有没有办法保持这一行?这种性能是否与仅使用大量列表一样好? 感谢您的输入。

0 个答案:

没有答案