长熊猫逻辑运算

时间:2017-04-09 22:18:27

标签: python pandas coding-style

有没有更好的方法来编写这个长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()

2 个答案:

答案 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")