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 数据框中保留其他内容?