Python如何在pandas数据框中提取[]括号内的指定字符串并创建一个具有布尔值的新列

Posted

技术标签:

【中文标题】Python如何在pandas数据框中提取[]括号内的指定字符串并创建一个具有布尔值的新列【英文标题】:Python How to extract specified string within [ ] brackets in pandas dataframe and create a new column with boolean values 【发布时间】:2016-12-14 18:40:55 【问题描述】:

我是编程新手,非常感谢您的任何见解!

我有一个这样的数据框。

df;

            info                Price  
0   [100:Sailing]                $100
1   [150:Boating, 100:Sailing]   $200
2   [200:Surfing]                $300

我想根据 info 列中的信息创建具有活动名称的新列,如果 info 列中有相应的名称,则在新列中添加 1。它看起来像下面的数据框。

   Price  Sailing  Boating  Surfing
0   $100       1         0        0
1   $200       1         1        0
2   $300       0         0        1

我尝试了代码攻击,但没有奏效..(尽管这种方法在其他列中有效)

df1 = df.info.str.extract(r'(Boating|Sailing|Surfing)',expand=False)
df2 = pd.concat([df,pd.get_dummies(df1).astype(int)],axis=1)

我有超过 10000 个这样的数据,所以理想情况下,我想编写一个代码,在 info 列中自动提取指定的字符串(如 Surfing),创建一个带有活动名称的新列并返回 1 或 0,如上所示.我认为可能是数据框中的数据或数据类型中的括号导致了问题,但我不知道如何解决这个问题..

【问题讨论】:

【参考方案1】:

我假设 info 列中值的格式类似于 Python 列表。

df1 = df['info'].str[1:-1].str.replace(' ', '').str.get_dummies(',')
df1.rename(columns=lambda x: x.rsplit(':')[-1], inplace=True)
df2 = pd.concat([df, df1.astype(int)], axis=1)

df2
Out: 
                         info Price  Sailing  Boating  Surfing
0               [100:Sailing]  $100        1        0        0
1  [150:Boating, 100:Sailing]  $200        1        1        0
2               [200:Surfing]  $300        0        0        1

【讨论】:

感谢您的建议!我无法考虑这种方法;)当我运行代码时,我收到了一个类似“AttributeError:Can only use .str accessor with string values, which use np.object_ dtype in pandas”的错误。错误听起来像 info 列中的值不是字符串值,我需要以某种方式更改它以运行代码..(?)你知道是什么导致了这个错误吗? 我认为它们可以是实际的列表。你可以试试这个作为第一行吗df1 = df['info'].str.join('___').str.get_dummies('___') 哇!它就像魔术一样工作!太感谢了!我意识到df['info'].str.join('___') 神奇地删除了信息列中的括号。但我还没有弄清楚这个逻辑是如何运作的。能否详细说明.str.join('___').str.get_dummies('___')的作用?我真的很想明白这一点。 实际上没有括号。只有在打印列表时才会看到这些括号。 str.join(sep) 获取列表的每个元素,并使用提供的分隔符将它们连接起来。所以如果你有一个列表['a', 'b', 'c']`,str.join(',') 会给你'a, b, c'。由于 str.get_dummies 使用分隔符来生成列,因此该分隔符应该是实际字符串中看不到的东西。如果您确定文本中没有逗号,您也可以使用逗号(用于加入和获取假人)。

以上是关于Python如何在pandas数据框中提取[]括号内的指定字符串并创建一个具有布尔值的新列的主要内容,如果未能解决你的问题,请参考以下文章

如何从python中的pandas数据框中的列中提取关键字(字符串)

如何删除单引号,并在转换为to_json后将括号添加到pandas数据框中?

如何仅提取时代细节并在 pandas 数据框中保留其他内容?

如何在 Pandas 数据框中按行值对日期时间列进行排序?

使用正则表达式在 Pandas 数据框中字符串开头的大括号内去除数字

从 API 中提取数据并将记录存储在 Pandas 数据框中