【问题标题】:Python regular expression in a column of a dataframe数据框列中的 Python 正则表达式
【发布时间】:2021-04-10 08:21:24
【问题描述】:

我为 Excel 自动化编写了一个 Python 脚本。在这个自动化过程中,我被困在了一个点之间。我想在数据框的列中应用正则表达式。尝试了很多方法,但无法产生我想要的完全期望的结果。我有如下数据框(简短示例)-

这是示例数据框,其中包含大量列。我想在名为 ID 列的 C 列中应用正则表达式。我想根据 $, & 分隔符拆分此数据框中的数据,但也想忽略(删除)* 和 & 或 * 和 $ 之间的所有值。我们在 C(ID) 列中找到空单元格的行可以删除或忽略。以下是我想要的输出数据框示例-

我已尝试关注-

import pandas as pd
import re
df = pd.read_excel("Deal Id Part Comparison Master File.xlsx", "Data Dump", header=1)
splits= []
for i in df['ID']:
    s = str(i)
    splits.append(re.split('\$|\&',s))

print(f' final list {splits}')

上面的代码能够根据 $ 和 & 拆分数据并将它们存储在列表中。但是 * 和 $ 或 * 和 & 之间的数据不会被忽略。我也想爆炸数据。

我确信可以有一个班轮来完成这项任务但无法生成最终输出

【问题讨论】:

  • @Ch3steR 但我想忽略 * 和 & 或 * 或 $ 之间的数据。这不会给出确切的解决方案。因此,这不会给出确切的结果
  • 我的错误错过了这一点。添加了答案

标签: python regex pandas dataframe


【解决方案1】:

你可以使用

import pandas as pd
df = pd.DataFrame({'Order': ['10-112','10-115'], 'Owner':['shubhman', 'rishab'], 'ID':['89ab$cd&78','']})

df['ID'] = df['ID'].str.replace(r'\*[^&$]*[&$]', '').str.split(r'[$&]') # Remove substrings between * and $ or &
df = df.explode('ID') # Split the rows with multiple IDs into multiple rows
df = df[df['ID'].astype(bool)] # Discard the rows with an empty ID
>>> df
    Order     Owner    ID
0  10-112  shubhman  89ab
0  10-112  shubhman    cd
0  10-112  shubhman    78

这里的正则表达式匹配:

  • .replace(r'\*[^&$]*[&$]', '') - 替换 *(与 \* 匹配)和最接近的、最左边的 &$(先出现的)之间的所有子字符串,请参阅 regex demo
  • .str.split(r'[$&]') - 与 $& 字符分开(注意,您不需要在字符类中转义)。

【讨论】:

  • @Wiktor Stribiżew 谢谢你的回答。这对我很有用...
  • @Ch3steR 也感谢您的帮助。由于您也尽力提供解决方案
【解决方案2】:

为了安全起见,我需要更多地了解数据,但在处理 DataFrame 时,您应该首先考虑向量,然后考虑循环。

查看字符串访问器方法。

pandas.Series.str.replace删除*$之间的值,&

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.replace.html

pandas.Series.str.split

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.split.html?highlight=str%20split#pandas.Series.str.split

pandas.wide_to_long

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.wide_to_long.html#pandas.wide_to_long

pandas.melt

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.melt.html#pandas.melt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-23
    • 2021-03-20
    • 1970-01-01
    • 2016-09-29
    • 2020-10-06
    • 2019-08-22
    • 1970-01-01
    • 2016-09-27
    相关资源
    最近更新 更多