【问题标题】:How to create multiple columns based on string.contains如何基于 string.contains 创建多列
【发布时间】:2021-03-11 08:31:48
【问题描述】:

我正在尝试使用以下语句根据单个列中的值创建一个新列/列:

df.loc[df['Figure'].str.contains(r'^(?=.*BLUE)(?=.*HOTEL)'),'Location'] = 'BLUE HOTEL'
df.loc[df['Figure'].str.contains(r'^(?=.*Expensive)'),'Location'] = 'left'
df.loc[df['Figure'].str.contains(r'^(?=.*Cheap)'),'Location'] = 'Right'

如果原始列包含超过 1 个上述字符串,我希望将其插入单独的第二个新列,并可能插入第三个新列。

因此,目标是将确定的关键词分别放入不同的列中。 有人对如何编写此代码有任何建议吗?

提前致谢

【问题讨论】:

  • 如何为 3 个案例分别制作 3 个单独的列?

标签: python-3.x regex string multiple-columns


【解决方案1】:

通过将所有可能的匹配项放在一个列中,然后在匹配项超过一个时扩展列,容易产生不一致的列,之后难以操作。为 3 个案例中的每一个创建 3 个单独的列将是一个更好的选择。举例说明:

创建示例数据:

data = {'Figure': ['GREAT BLUE HOTEL', 'Expensive choice', 'Cheap and good', 'Nothing interesting', 'Cheap BLUE OCEAN HOTEL']}
df = pd.DataFrame(data)

print(df)

    Figure
0   GREAT BLUE HOTEL
1   Expensive choice
2   Cheap and good
3   Nothing interesting
4   Cheap BLUE OCEAN HOTEL

运行代码:

df['BLUE HOTEL'] = df['Figure'].str.contains(r'^(?=.*BLUE)(?=.*HOTEL)')
df['left'] = df['Figure'].str.contains(r'^(?=.*Expensive)')
df['right'] = df['Figure'].str.contains(r'^(?=.*Cheap)')

结果数据框:

                   Figure  BLUE HOTEL   left  right
0        GREAT BLUE HOTEL        True  False  False
1        Expensive choice       False   True  False
2          Cheap and good       False  False   True
3     Nothing interesting       False  False  False
4  Cheap BLUE OCEAN HOTEL        True  False   True

然后,您可以通过以下方式操作或过滤数据:

df[df['BLUE HOTEL']]        # filter entries with 'BLUE' and 'HOTEL'

Output:
                   Figure  BLUE HOTEL   left  right
0        GREAT BLUE HOTEL        True  False  False
4  Cheap BLUE OCEAN HOTEL        True  False   True


df[df['right']]             # filter entries with 'Cheap'

Output:    
                   Figure  BLUE HOTEL   left  right
2          Cheap and good       False  False   True
4  Cheap BLUE OCEAN HOTEL        True  False   True

【讨论】:

  • 谢谢,也许我的例子不完整。代替 3 列,有大约 20 个关键字可以插入到 3 列中。因为一个字符串最多可以包含 3 个可能的关键词,所以最多有 3 列(因子 1、因子 2、因子3)。 (这些列应填充大约 20 个出现的关键字。)它们在列中插入的顺序无关紧要。例如;如果一列填充了一个关键字并且原始字符串包含另一个关键字,则第二个关键字将放置在第二列中..
  • @Wolfy14 在这种情况下,实现逻辑的机制应该还是一样的。将BLUE HOTEL、left、right 替换为factor1、factor2、factor3,并设置正则表达式以相应地提取 20 个关键词。那么,还有什么问题吗?由于您没有提供所有数据,因此此处的帮助最多只能为您提供一种机制而不是实际代码。
  • 好的,非常感谢您的洞察力。我想我会尝试两种方法,看看哪种方法更适合更大的数据系统。之后扩展时,您如何理解不一致的困难?我知道这会使第 2 列和第 3 列留下很多空值。
  • @Wolfy14 第 1 列将与各种匹配项混合在一起,而不仅仅是一种匹配项。如果每一列都被明确定义为保存一种匹配项,那么操作就不是那么容易了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 2020-02-06
相关资源
最近更新 更多