【问题标题】:how do Iterate through the rows and print the desired output in pandas data frame如何遍历行并在熊猫数据框中打印所需的输出
【发布时间】:2021-10-28 22:10:52
【问题描述】:

enter image description here

我尝试使用 for 循环,但它只打印出每一行的世界接受率。

我想要的输出:

24922 YES BANK LTD (97%); NOMURA SECURITIES CO LTD (91%)
24924 ZENSAR TECHNOLOGIES LTD (97%);
25096 TUI AG (94%); CITIGROUP INC (93%); UBS INVESTMENT BANK (91%); 

【问题讨论】:

  • 请将您的代码和数据(例如print(df) 的结果)直接发布到您的问题而不是图片。
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: python pandas dataframe numpy loops


【解决方案1】:

为了更加惯用和 Pandas 风格,当有替代 Pandas 函数执行类似功能时,您应该避免使用 re 函数。这些替代的 Pandas 函数针对矢量化操作进行了更好的优化,以便与 Pandas 一起更高效地运行。

您可以使用 Pandas 函数 str.findall() 来查找与模式匹配的所有子字符串。然后,使用str.join() 连接所有这些子字符串。

请注意,您需要稍微更改您的正则表达式,以允许匹配末尾没有分号 ; 的子字符串。否则,当您在模式上使用findall() 时,结果中将缺少子字符串NOMURA SECURITIES CO LTD (91%)(末尾没有;)。

df['company'] = df['company'].str.findall(r'(.*? \((?:9\d|[1-9]\d{2,})%\);?)').str.join('')

结果:

print(df)

      id                                                        company
0  24918                                   WORLD ACCEPTANCE CORP (94%);
1  24922             YES BANK LTD (97%); NOMURA SECURITIES CO LTD (91%)
2  24924                                 ZENSAR TECHNOLOGIES LTD (97%);
3  25096  TUI AG (94%); CITIGROUP INC (93%); UBS INVESTMENT BANK (91%);

【讨论】:

    【解决方案2】:

    这是一种通用的编程实践 - 您不应修改在同一循环中迭代的数据结构。

    在您的循环中,您将用第一行的值覆盖company 列的所有值。您可以使用 pandas DataFrame 的 .map() 方法覆盖您的列,而不是循环。

    pattern = ...
    df["company"] = df["company"].map(lambda row: "".join(re.findall(pattern, row)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 2021-07-19
      • 2020-11-20
      • 1970-01-01
      相关资源
      最近更新 更多