【问题标题】:Split values in column by column number with pandas使用熊猫按列号拆分列中的值
【发布时间】:2021-04-28 04:15:54
【问题描述】:

我正在尝试使用 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'

我收到同样的信息。

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

谢谢

【问题讨论】:

  • 您能否举例说明第一行的内容,即df[0],以便我们重现错误?错误消息似乎表明您正在尝试访问名为 list 的列,该列在数据框中不存在。
  • 桌子上的第一行是这样的(已经削减了一些列)总共有 11 列 0 NaN 10:05 - € 14,720 55.3% € 7,386 44% € 9,397 56%
  • 更新。我已经设法拆分我想要的列并生成新列并将我拆分的值放入这些新列中。问题是我在第一个空间拆分,而我想在第二个空间拆分,我无法让它工作。我已经通过谷歌搜索尝试了所有解决方案,但没有任何效果。
  • 你想在 每隔 个空格分割字符串,还是只分割一次?例如,如果你有"A B C D E",你想要"A B","C D","E" 还是"A B","C","D","E"
  • 我在每个单元格上都有一个字符串,格式为 € 1,390 75% 你看有两个空格。货币符号后一个,数字后一个。我设法在第一个空格上分隔字符串并创建两个新列。但是在一个新列上,它放置了 € 符号,而在另一列上放置了其余数字。我想去掉 € 符号,将金额保留在一列中,将百分比保留在另一列中。

标签: python pandas dataframe web-scraping split


【解决方案1】:

根据 cmets 中的讨论,这就是您要查找的内容:

# 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】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      • 2019-11-05
      • 2014-02-19
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      相关资源
      最近更新 更多