根据last_valid_index值过滤熊猫DataFrame

时间:2019-07-30 23:33:35

标签: python pandas

是否有基于列last_valid_index过滤pandas DataFrame的适当方法?

例如,我希望所有行的最后一个有效索引值的格式均为(\d{13})

输入:

      0  ...    15             16             17   18
24  10.0 ...  1107  8712566328208            NaN  NaN
25   6.0 ...  363K           1243  8712100849084  NaN
26  10.0 ...   758  3251510550005            NaN  NaN
27   8.0 ...  245K            780  3560070774425  NaN
29   6.0 ...  1485  7613034528971            NaN  NaN
29   6.0 ...  1485          test1            NaN  NaN
29   6.0 ...  1485            280           test  NaN

输出:

      0  ...    15             16             17   18
24  10.0 ...  1107  8712566328208            NaN  NaN
25   6.0 ...  363K           1243  8712100849084  NaN
26  10.0 ...   758  3251510550005            NaN  NaN
27   8.0 ...  245K            780  3560070774425  NaN
29   6.0 ...  1485  7613034528971            NaN  NaN

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以尝试将.applyaxis=1一起使用,以获取每行last_valid_index,然后使用df.lookup获取实际值,并使用.str.match进行比较他们到正则表达式。

尝试一下:

from io import StringIO
import pandas as pd

import re

s = """
      0      15             16             17   18
24  10.0   1107  8712566328208            NaN  NaN
25   6.0   363K           1243  8712100849084  NaN
26  10.0    758  3251510550005            NaN  NaN
27   8.0   245K            780  3560070774425  NaN
29   6.0   1485  7613034528971            NaN  NaN
30   6.0   1485          test1            NaN  NaN
31   6.0   1485            280           test  NaN"""

df = pd.read_csv(StringIO(s), sep="\s+")

last_valid_indices = df.apply(lambda row: row.last_valid_index(), axis=1)
last_valid_vals = pd.Series(df.lookup(last_valid_indices.index, last_valid_indices.values), index=last_valid_indices.index)
print(df[last_valid_vals.str.match("\d{13}")])

输出:

       0    15             16             17  18
24  10.0  1107  8712566328208            NaN NaN
25   6.0  363K           1243  8712100849084 NaN
26  10.0   758  3251510550005            NaN NaN
27   8.0  245K            780  3560070774425 NaN
29   6.0  1485  7613034528971            NaN NaN

答案 1 :(得分:0)

这是使用ffill

的一种方法
df[(pd.to_numeric(df.ffill(1).iloc[:,-1],errors='coerce')//1e12).between(1,9)]
       0  ...    15             16             17  18
24  10.0  ...  1107  8712566328208            NaN NaN
25   6.0  ...  363K           1243  8712100849084 NaN
26  10.0  ...   758  3251510550005            NaN NaN
27   8.0  ...  245K            780  3560070774425 NaN
29   6.0  ...  1485  7613034528971            NaN NaN