【问题标题】:Categorize a 'string' column based on the text word present in it using pre-defined categories in another column使用另一列中的预定义类别根据其中存在的文本单词对“字符串”列进行分类
【发布时间】:2019-06-06 14:28:51
【问题描述】:

我有一个带有电子邮件域的 pandas 列,如下所示:

Sno  Domain_IDs
1   herowire.com
2   xyzenerergy.com
3   financial.com
4   oo-loans.com
5   okwire.com
6   cleaneneregy.com
7   pop-advisors.com

等等……

我在单独的数据框中有以下分类:

Sno category
1   contains wire
2   contains energy
3   contains loans
4   contains advisors

我想创建一个数据框,将数据分类如下:

Sno Domain_IDS         category
1   herowire.com       contains wire
2   xyzenerergy.com    contains energy
3   financial.com      others
4   oo-loans.com       contains loans
5   okwire.com         contains wire
6   cleaneneregy.com   contains energy
7   pop-advisors.com   contains advisors

我尝试使用 lambda 函数和使用“if else”语句的标准循环,通过使用

"emailAddress.str.contains('wire')"

包含子句,但我收到以下错误:

AttributeError: 'str' object has no attribute 'str'

不知何故,我无法解析数据框中的单行文本。请帮忙。

【问题讨论】:

  • wire-loans.com 或 energy-advisors.com 怎么样?他们只有一个类别吗?如果有,是哪一个?
  • 我认为哪个词先出现对我有用。它可以属于任一类别。没有区别。虽然我很想看看我如何区分它们。谢谢@SourceSimian

标签: python-3.x pandas dataframe data-science categories


【解决方案1】:
lst = ["wire", "energy", "loans","advisors"]
def fun(a):
    for i in lst:
        if i in a:
            return i
    return "others"
df["category"] = df.Domain_IDs.apply(lambda x: fun(x))
df

  Sno        Domain_IDs category
0   1      herowire.com     wire
1   2   xyzenenergy.com   energy
2   3     financial.com   others
3   4      oo-loans.com    loans
4   5        okwire.com     wire
5   6   cleanenergy.com   energy
6   7  pop-advisors.com advisors

【讨论】:

  • 所以这个方法不能处理多个类别
【解决方案2】:

在域中查找模式,提取并创建类别

pat =  '('+'|'.join(cat['Sno category'].str.split().str[-1])+')'
df['category'] = ('contains ' + df['Domain_IDs'].str.extract(pat)).fillna('other')

   Sno  Domain_IDs          category
0   1   herowire.com        contains wire
1   2   xyzenenergy.com     contains energy
2   3   financial.com       other
3   4   oo-loans.com        contains loans
4   5   okwire.com          contains wire
5   6   cleaneneregy.com    other
6   7   pop-advisors.com    contains advisors

【讨论】:

  • 感谢您的回答。我还有一个问题,如果你愿意回答的话。我们如何利用 NLP 自行创建类别?例如,上面没有提到的一个类别是“服务”,如何根据在域中看到的次数自动生成该类别。有什么想法吗?
  • @KshitijYadav,这是一个完全不同的问题。如果您为此发布一个新问题,您将获得更好的答案
  • 嗨@Vaishali,你能帮我解决这个问题吗:stackoverflow.com/questions/55190428/…
【解决方案3】:

此解决方案允许进行多种分类:

categories = pd.DataFrame({"category": ["wire", "energy", "loans", "advisors"]})
domains = pd.DataFrame({"Sno": list(range(1, 10)),
                        "Domain_IDs": [
                            "herowire.com",
                            "xyzenergy.com",
                            "financial.com",
                            "oo-loans.com",
                            "okwire.com",
                            "cleanenergy.com",
                            "pop-advisors.com",
                            "energy-advisors.com",
                            "wire-loans.com"]})    
categories["common"] = 0
domains["common"] = 0

possibilities = pd.merge(categories, domains, how="outer")
possibilities["satisfied"] = possibilities.apply(lambda row: row["category"] in row["Domain_IDs"], axis=1)

所以只过滤满足的类别:

possibilities[possibilities["satisfied"]]

给予:

    category  common           Domain_IDs  Sno satisfied
0       wire       0         herowire.com    1      True
4       wire       0           okwire.com    5      True
8       wire       0       wire-loans.com    9      True
10    energy       0        xyzenergy.com    2      True
14    energy       0      cleanenergy.com    6      True
16    energy       0  energy-advisors.com    8      True
21     loans       0         oo-loans.com    4      True
26     loans       0       wire-loans.com    9      True
33  advisors       0     pop-advisors.com    7      True
34  advisors       0  energy-advisors.com    8      True

【讨论】:

    猜你喜欢
    • 2022-02-04
    • 1970-01-01
    • 2015-10-29
    • 2019-02-25
    • 1970-01-01
    • 2021-07-30
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多