Python 使用特定条件筛选数据帧中的行
我有一个数据框,它是用制表符分隔的。我想在第三列的第一部分获得包含特定字符串的行。 请参见此示例:Python 使用特定条件筛选数据帧中的行,python,pandas,Python,Pandas,我有一个数据框,它是用制表符分隔的。我想在第三列的第一部分获得包含特定字符串的行。 请参见此示例: col1 col2 col3 a a1 good | bad b b1 bad | bad c c1 foogood | foobad d d1 bad | good e e1 good | good f
col1 col2 col3
a a1 good | bad
b b1 bad | bad
c c1 foogood | foobad
d d1 bad | good
e e1 good | good
f f1 bad | foobad
在这里,我想分隔|
字符的第三列。然后,我想在第一部分中使用stringgood
。所以期望的输出是
col1 col2 col3
a a1 good | bad
c c1 foogood | foobad
e e1 good | good
我知道这可以使用apply
函数来完成,但我不知道如何使用apply
来定义这样的函数。我还尝试使用[]
进行过滤,但无法使其正常工作。感谢兄弟姐妹们的帮助
更新:我还拥有底层TSV文件,并且知道这也可以使用
grep
和awk
完成。所以这两种解决方案都可以。您可以使用str.split
和contains
yourdf=df[df.col3.str.split('|').str[0].str.contains('good')]
您可以使用
str.split
和contains
yourdf=df[df.col3.str.split('|').str[0].str.contains('good')]
这是非常容易与awk
$ cat file
col1 col2 col3
a a1 good | bad
b b1 bad | bad
c c1 foogood | foobad
d d1 bad | good
e e1 good | good
f f1 bad | foobad
$
$ awk -F $'\t' '(NR == 1 || $3 ~ /^[^|]*good/)' file
col1 col2 col3
a a1 good | bad
c c1 foogood | foobad
e e1 good | good
此外,您还可以尝试一下sed
:
sed -n '1p; /^[^\t]*\t[^\t]*\t[^|]*good/p' file
这也会产生所需的结果。使用awk非常容易
$ cat file
col1 col2 col3
a a1 good | bad
b b1 bad | bad
c c1 foogood | foobad
d d1 bad | good
e e1 good | good
f f1 bad | foobad
$
$ awk -F $'\t' '(NR == 1 || $3 ~ /^[^|]*good/)' file
col1 col2 col3
a a1 good | bad
c c1 foogood | foobad
e e1 good | good
此外,您还可以尝试一下sed
:
sed -n '1p; /^[^\t]*\t[^\t]*\t[^|]*good/p' file
这也会产生所需的结果。如果所需文本以
good
开头,后面总是跟着|
,那么您可以直接在.contains()
中将它们组合成一个子字符串(按此顺序)。熊猫可以过滤掉这些行
输入测向
df
col1 col2 col3
0 a a1 good | bad
1 b b1 bad | bad
2 c c1 foogood | foobad
3 d d1 bad | good
4 e e1 good | good
5 f f1 bad | foobad
滤波测向
df[df['col3'].str.contains('good | \n')]
col1 col2 col3
0 a a1 good | bad
2 c c1 foogood | foobad
4 e e1 good | good
你也可以用坏的
(而不是好的
)
如果所需文本以
good
开头,后面总是跟着|
,则可以直接在.contains()
中将它们组合成一个子字符串(按此顺序)。熊猫可以过滤掉这些行
输入测向
df
col1 col2 col3
0 a a1 good | bad
1 b b1 bad | bad
2 c c1 foogood | foobad
3 d d1 bad | good
4 e e1 good | good
5 f f1 bad | foobad
滤波测向
df[df['col3'].str.contains('good | \n')]
col1 col2 col3
0 a a1 good | bad
2 c c1 foogood | foobad
4 e e1 good | good
你也可以用坏的
(而不是好的
)
因为字符串中不需要任何正则表达式模式,所以可以设置
regex=False
+1因为字符串中不需要任何正则表达式模式,所以可以设置regex=False
+1