根据特定条件过滤熊猫数据框中的行

时间:2018-10-21 20:48:40

标签: python pandas

我有一个制表符分隔的熊猫数据框。我想在第三列的第一部分中获取包含特定字符串的行。 参见以下示例:

      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来完成。所以任何一种解决方案都很好。

3 个答案:

答案 0 :(得分:2)

您可以将str.splitcontains一起使用

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