代码之家  ›  专栏  ›  技术社区  ›  kostello

用pandas按列号拆分列中的值

  •  0
  • kostello  · 技术社区  · 3 年前

    我试图使用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")
    

    在输出上,某些单元格的两个值显示在一行中,例如14720 55.3%。 如您所见,我在同一行上有一个金额和一个百分比,还有一些用NaN显示的空列。 我想用第二个空格将金额与百分比分开,并将百分比转移到旁边的新列(百分比)中。 我尝试使用str.split,但收到错误消息 “数据帧对象没有属性列表” . 我尝试的其他方法也会出现同样的错误,即Dataframe对象没有属性。。。。。 我使用以下命令将url列表转换为Dataframe

    df = pd.DataFrame(urls)
    

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

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

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

    AttributeError:“list”对象没有属性“drop”

    我也收到了同样的信息。

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

    谢谢

    0 回复  |  直到 3 年前
        1
  •  0
  •   Kris    3 年前

    根据评论中的讨论,这就是你想要的:

    # simple reproducible example
    import pandas as pd
    df = pd.DataFrame()
    df['values'] = ['€ 1,390 75%','€ 45 12.8%','€ 14,390 9%']
    
    # this removes the currency symbol
    def remove_symbol(x):
        x = x.split(' ')
        return ' '.join(x[1:])
    
    # this splits the remaining string into two columns on the space seperator
    df[['money','percentage']] = df['values'].apply(lambda x: remove_symbol(x)).str.split(' ', 1, expand=True)
    

    输出:

        values      money   percentage
    0   € 1,390 75% 1,390   75%
    1   € 45 12.8%  45      12.8%
    2   € 14,390 9% 14,390  9%
    
    
        2
  •  0
  •   kostello    3 年前

    我设法用这段代码解决了这个问题。 谢谢你的帮助。。

        # -*- 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)