我有一个清单:
things = ['A1','B2','C3']
Run Code Online (Sandbox Code Playgroud)
我有一个pandas数据框,其中一列包含以分号分隔的值 - 一些行将包含与上面列表中的一个项匹配的匹配(由于它具有字符串的其他部分,因此不会完美匹配)列...例如,该列中的一行可能有'哇;这里;这= A1 ; 10001; 0')
我想保存包含与列表中的项匹配的行,然后使用这些选定的行创建一个新的数据框(应该具有相同的标题).这是我试过的:
import re
for_new_df =[]
for x in df['COLUMN']:
for mp in things:
if df[df['COLUMN'].str.contains(mp)]:
for_new_df.append(mp) #This won't save the whole row - help here too, please.
Run Code Online (Sandbox Code Playgroud)
这段代码给了我一个错误:
ValueError:DataFrame的真值是不明确的.使用a.empty,a.bool(),a.item(),a.any()或a.all().
我对编码很新,所以答案中的解释和细节越多越好!提前致谢.
您可以通过加入单词列表来创建正则表达式并使用以避免循环str.contains:
pat = '|'.join(thing)
for_new_df = df[df['COLUMN'].str.contains(pat)]
Run Code Online (Sandbox Code Playgroud)
应该工作
因此正则表达式模式变为:'A1|B2|C3'这将匹配包含任何这些字符串的字符串中的任何位置
例:
In [65]:
things = ['A1','B2','C3']
pat = '|'.join(things)
df = pd.DataFrame({'a':['Wow;Here;This=A1;10001;0', 'B2', 'asdasda', 'asdas']})
df[df['a'].str.contains(pat)]
Out[65]:
a
0 Wow;Here;This=A1;10001;0
1 B2
Run Code Online (Sandbox Code Playgroud)
至于它失败的原因:
if df[df['COLUMN'].str.contains(mp)]
Run Code Online (Sandbox Code Playgroud)
这一行:
df[df['COLUMN'].str.contains(mp)]
Run Code Online (Sandbox Code Playgroud)
返回由内部的布尔数组掩盖的df str.contains,if不了解如何评估布尔数组因此错误.如果你想一想,如果你是真的或者只有一个是真的,它该怎么办?它期望一个标量,而不是像数组一样的值.
| 归档时间: |
|
| 查看次数: |
5573 次 |
| 最近记录: |