是否有基于列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
谢谢!
答案 0 :(得分:1)
您可以尝试将.apply
与axis=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