我有一个制表符分隔的熊猫数据框。我想在第三列的第一部分中获取包含特定字符串的行。 参见以下示例:
city price bedroom Density city_type
1 San Jose 2000 1 5358 Urban
2 Barstow 1000 1 547 Suburb
3 <NA> 500 1 NA <NA>
在这里,我想在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
字符上分隔第三列。然后,我想在第一部分中使用具有字符串|
的字符串。因此所需的输出将是
good
我知道可以使用 col1 col2 col3
a a1 good | bad
c c1 foogood | foobad
e e1 good | good
函数来完成此操作,但是我不知道如何使用apply
来定义这样的函数。我还尝试使用apply
进行过滤,但无法正常工作。感谢兄弟姐妹们的帮助。
更新:我也有底层的TSV文件,并且知道也可以使用[]
和grep
来完成。所以任何一种解决方案都很好。
答案 0 :(得分:2)
您可以将str.split
与contains
一起使用
yourdf=df[df.col3.str.split('|').str[0].str.contains('good')]
答案 1 :(得分:1)
这对于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
也会产生预期的结果。
答案 2 :(得分:1)
如果所需的文本以good
开头,并且始终以|
开头,则可以直接在.contains()
中将它们组合成单个子字符串(按此顺序)。熊猫可以过滤掉这些行。
输入DF
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[df['col3'].str.contains('good | \n')]
col1 col2 col3
0 a a1 good | bad
2 c c1 foogood | foobad
4 e e1 good | good
您可以对bad
(而不是good
)进行同样的操作
df[df['col3'].str.contains('bad | \n')]
col1 col2 col3
1 b b1 bad | bad
3 d d1 bad | good
5 f f1 bad | foobad