【问题标题】:Loop through column to find words' indexes against a list of words遍历列以根据单词列表查找单词的索引
【发布时间】:2021-09-22 21:09:27
【问题描述】:

给定一个 DataFrame,我想根据值列表检查一列,并判断该单词是否存在于单元格中,并将索引的结果(其所在位置的字符数)添加到新的列。

例子:

df_Words

Words
Dog, Cat, Duck
Cow, Horse, Pig
Monkey, Snake, Rat

xList = [狗、鼠、马]

df_Words

Words Index
Dog, Cat, Duck 1
Cow, Horse, Pig 6
Monkey, Snake, Rat 16

我尝试了函数/循环,但无法使其正常工作。我只能为单个值执行此操作,例如:

xList = [Dog, Rat, Horse]
  
for x in xList:

    index = df_Words["Words"].str.find(x)
    df_Words["Indexes"]= index

【问题讨论】:

  • 我不确定是否有一种好方法可以一次完成所有操作。您可以使用正则表达式 (r"Dog|Rat|Horse") 搜索单词是否存在,并且可以在没有循环的情况下批量执行此操作,但这不会为您提供起始字符。

标签: python pandas


【解决方案1】:

从单词列表中创建一个正则表达式并将字符串分成两部分。第一部分的长度是索引。

WORDS = fr"\b({'|'.join(xList)})\b"

df['Index'] = df['Words'].str.split(WORDS, n=1, expand=True)[0].apply(len) + 1

输出:

>>> df
                Words  Index
0      Dog, Cat, Duck      1
1     Cow, Horse, Pig      6
2  Monkey, Snake, Rat     16

>>> print(WORDS)
\b(Dog|Rat|Horse)\b

【讨论】:

    【解决方案2】:

    不完全是预期的输出,但你可以这样尝试(首先将单词分成一个列表):

    示例输入:

    import pandas as pd
    df_raw = pd.DataFrame({
     'Words': {0: ['Dog', 'Cat', 'Duck'],
      1: ['Horse', 'Cow', 'Pig'],
      2: ['Monkey', 'Snake', 'Rat']}})
    xList = ['Dog', 'Rat', 'Horse']
    

    代码:

    df = df_raw.reset_index().copy()
    df = df.explode('Words')
    df['pos'] = df.groupby(['index']).cumcount()
    df = df[df['Words'].isin(xList)]
    df = df.groupby(['index'])['pos'].apply(list)
    
    df_raw.join(df)
    

    输出:

                      Words  pos
    0      [Dog, Cat, Duck]  [0]
    1     [Horse, Cow, Pig]  [0]
    2  [Monkey, Snake, Rat]  [2]
    

    pos 为您提供列表的索引。例如。 [0] 表示 Words 列中列表索引为 0 的元素。

    【讨论】:

      【解决方案3】:

      您的基于循环的方法是正确的。 只是你总是用找到的最后一个索引覆盖df_Words["Indexes"] 的单个值,并且你在描述中说你需要一个索引集合。

      因此,如果 df_Words["Indexes"] 是一个列表,无论是从其他地方提供给您还是由您初始化 (df_Words["Indexes"] = []),您都可以使用 df_Words["Indexes"].append(index),因此您将最后一个值添加到列表中,而不是用一个数字覆盖整个列表。

      您也可以在没有显式循环的情况下执行此操作,尽管有效,但您无法避免迭代。 我假设单词由空格分隔,并且没有引用字段应该被视为“单词”,例如一些 CSV 方言会允许。

      xList = [Dog, Rat, Horse]
      df_Words["Indexes"] = [index for (index, word) in enumerate(df_Words["Words"].str.split()) if word in xList]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        • 2018-12-27
        • 1970-01-01
        • 2020-09-12
        • 2020-12-01
        • 1970-01-01
        • 2017-11-27
        相关资源
        最近更新 更多