有没有更好的方法来编写这个长pandas逻辑操作?我只列出了下面的几个例子,但实际上有更多的检查。这样做可以,但我觉得可能有更清洁的方式来表达这个操作。如果您对这些数据感到好奇,那么NYC taxi data任何建议都表示赞赏。
mask = (df.Fare_amount >= 2.5) & \
(df.Total_amount >= 2.5) & \
(df.Tip_amount >= 0) & \
(df.Tolls_amount >= 0) & \
(df.Extra >= 0) & \
(df.Trip_distance > 0) & \
(df.Passenger_count.between(1, 5))
# I actually have some more checks here like these above....
new_df = df[mask].copy()
答案 0 :(得分:2)
不确定是否有更好的方法,但一个选项可能是将具有相同条件的列组合在一起并在行上使用all
以减少所使用的&
操作的数量:
mask = (df[['Fare_amount', 'Total_amount']] >= 2.5).all(1) & \
(df[['Tip_amount', 'Tolls_amount', 'Extra']] >= 0).all(1) & \
(df.Trip_distance > 0) & \
(df.Passenger_count.between(1, 5))
答案 1 :(得分:1)
我实际上更喜欢上面的Psidom给出的答案,因为我认为这个特别是" Pythonic"。但我认为我提到它是因为它是一种替代方法,偶尔也会有用。
DataFrames支持query
方法,您可以向其传递表示查询的字符串。这可以节省一些按键,但如果您的过滤条件经常更改,则不是最灵活的方式:
df.query("Fare_amount >= 2.5 & Total_amount >= 2.5 & "
"Tip_amount >= 0 & Tolls_amount >= 0 & Extra >= 0 & Trip_distance >= 0 & "
"1 <= Passenger_count <= 5")