首页 > 解决方案 > 使用熊猫按列号拆分值

问题描述

我正在尝试使用 pandas 使用 python 从 html 表中抓取数据。这些表在 url 上,所以我创建了一个列表

每个表在特定列的某些单元格上都有两个值。我设法读取所有数据,打印它们并将它们保存在 csv 文件中。这就是我这样做的方式。到目前为止我的代码是

# -*- coding: utf-8 -*- 
import pandas as pd
urls = ["https://url?date=2020-12-31", "https://url?date=2020-12-30", "https://url?date=2020-12-29"]
df = pd.DataFrame(urls)

        for url in urls:
            df = pd.read_html(url, parse_dates=True)  
            print(df[0])
            df[0].to_csv('file.csv', encoding='utf-8', mode='a', header=False, index=False)
            print ("Data have been extracted successfully")

在输出中,一些单元格的两个值出现在一行中,例如 € 14,720 55.3%。如您所见,我在同一行上有一个金额和一个百分比,以及一些带有 NaN 的空列。我想用第二个空格将金额与百分比分开,并将百分比转移到旁边的新列(百分比)中。我正在尝试使用 str.split,但我收到“数据框对象没有属性列表”的错误消息。还有其他方法我尝试我得到相同的错误,Dataframe 对象没有属性.....我将 urls 列表转换为 Dataframe

df = pd.DataFrame(urls)

但我仍然不明白这是否是转换的方式,因为它一直给我错误。

另外,当我尝试删除空列时

df.drop(df.columns[[0,1]], axis=1)

AttributeError: 'list' 对象没有属性 'drop'

我得到同样的信息。

所以,有两件事。我如何用第二个空格分隔特定列的值并将它们放在下一个新列中,然后如果我可以删除空列会很酷。按列号或空单元格。

谢谢

标签: pythonpandasdataframeweb-scrapingsplit

解决方案


我设法用这段代码解决了这个问题。感谢您的任何帮助..

    # -*- coding: utf-8 -*- 

import pandas as pd


#DATAFRAME AS OBJECT
df = pd.DataFrame()


urls = ["urllink"]

for url in urls:
        
        #READ URLS
        df = pd.read_html(url, parse_dates=True)
        df = df[0] 
           
    
        #SPLIT COLUMN ON 2nd SPACE AND CREATE 2 NEW COLUMNS WITH € AND %
        new1 = df["1"].str.split(" ", n = 2, expand = True)
        df["1 ΣΕ €"]= new1[1]
        df["1 ΣΕ %"]= new1[2]
        
    
        newX = df["Χ"].str.split(" ", n = 2, expand = True)
        df["Χ ΣΕ €"]= newX[1]
        df["Χ ΣΕ %"]= newX[2]
        
        
        new2 = df["2"].str.split(" ", n = 2, expand = True)
        df["2 ΣΕ €"]= new2[1]
        df["2 ΣΕ %"]= new2[2]
        
    
        newOVER = df["OVER"].str.split(" ", n = 2, expand = True)
        df["OVER ΣΕ €"]= newOVER[1]
        df["OVER ΣΕ %"]= newOVER[2]
        
        
        newUNDER = df["UNDER"].str.split(" ", n = 2, expand = True)
        df["UNDER ΣΕ €"]= newUNDER[1]
        df["UNDER ΣΕ %"]= newUNDER[2]
        
        #DELETE UNWANTED COLUMNS
        df.drop(df.columns[[0,1,2,4,5,7,8,9,10,11]], axis=1, inplace=True)
        
        
        print(df)
        
        df.to_csv('file.csv', encoding='utf-8', mode='a', header=False, index=False)
        

推荐阅读