【问题标题】:Python Pandas Dataframe - Cut specific part of string, when length to longPython Pandas Dataframe - 当长度变长时剪切字符串的特定部分
【发布时间】:2021-05-23 09:02:31
【问题描述】:

我正在为我的网球俱乐部开发一个 Python 网络爬虫,以从我的数据库中的网页保存游戏结果、排名等(然后将其显示在我自己的网站上)。工作得很好,我得到这样的表格:

但是,有些球队的名字在我的网站上输出得很好(尤其是当两个俱乐部在一起时)。

我的问题是:如果字符串达到一定长度,例如 34,我如何用 pandas 剪切“/”后面的所有内容。

到目前为止我的代码(对已爬取的信息进行了其他有效的更改):

for x in range(len(teams)):
     driver.get('https://baden.liga.nu/cgi-bin/WebObjects/nuLigaTENDE.woa  
     /wa/teamPortrait?team=' + teams[x][1])
     table_games = driver.page_source

     df = pd.read_html(table_games)[1]

     banned = ['TSG']
     f = lambda x: ' '.join([item for item in x.split() if item not in banned])
     df["Heimmannschaft"] = df["Heimmannschaft"].apply(f)
     df["Gastmannschaft"] = df["Gastmannschaft"].apply(f)


     df = df.rename(columns={'Datum, Uhrzeit.1': 'Termin'})
     df[['Datum', 'Uhrzeit']] = df.Termin.str.split(" ", expand=True, )
     del df['Termin']
     df = df[['Datum', 'Uhrzeit', 'Heimmannschaft', 'Gastmannschaft', 'Matches',                  
     'Spielbericht']]

     df.to_sql(con=con, name=teams[x][0]+'_Spiele', if_exists='replace')



     driver.get('https://baden.liga.nu/cgi-bin/WebObjects/nuLigaTENDE.woa
     /wa/groupPage?targetFed=BAD&championship=B1+S+2021&group=' + teams[x][2])
     table_ranks = driver.page_source

     df = pd.read_html(table_ranks)[0]

     f = lambda x: ' '.join([item for item in x.split() if item not in banned])
     df["Mannschaft"] = df["Mannschaft"].apply(f)

     df.iloc[0:, 1:].to_sql(con=con, name=teams[x][0]+ '_Tabelle', if_exists='replace')

driver.quit()

我的代码示例中的驱动程序会在 比赛日中爬到不同的网站,并且在这两种情况下,某些团队名称都太长了(所以我想删掉第二个团队名称, 从“/”开始)。

我希望你能帮助我。

【问题讨论】:

  • 所以你想把每个名字剪成一定的固定长度或'/'之后?
  • 在“/”之后,当字符串比 e.g. 34. 所以如果我喜欢“TC Germania 1890 Großsachsen/KSV 1948 Steinklingen”,它太长了(例如粗体字超过了限制),我不想把它剪成35 个字母,但在“/”处。在这种情况下,就像只有一个团队会玩一样。
  • 如果没有“/”,那么剪成34长?
  • 会是合理的,但是没有超过34个字母的球队(只有当两支球队一起比赛时)。

标签: python pandas web-crawler


【解决方案1】:

既然您提到只有当团队超过1 时,长度才会超过34,所以简单的解决方案是先检查长度,如果超过34,然后执行split/ 并获得第一队:

df['your_column'] = df['your_column'].apply(lambda x: x.split('/')[0] if len(x) > 34 else x)

【讨论】:

    【解决方案2】:

    只有在长度 > 34 的情况下,你才分裂并获得第一支队伍

    df['your_column'] = df['your_column'].apply(lambda x: x.split('/')[0] if len(x) > 34 else x)
    

    【讨论】:

    • 感谢您的快速答复!你的代码对我来说很有意义,但我得到了两个语法错误:一个在“34?”之后。一个在行尾。
    • 抱歉,逻辑是一样的,但我更改了语法以在 python 中有意义(早期的语法是三元运算符,在其他语言中很流行以执行相同的任务)。希望这对你有用
    • 但是现在你的答案和我已经发布的完全一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 2016-04-15
    • 2019-05-19
    • 1970-01-01
    • 2021-03-03
    • 2018-04-15
    相关资源
    最近更新 更多