pandas 数据框中的百分比匹配
Percentage match in pandas Dataframe
是否有一个函数可以告诉 pandas DataFrame 中匹配的百分比或数量,而无需执行类似这样的操作...
len(trace_df[trace_df['ratio'] > 0]) / len(trace_df)
0.189
len(trace_df[trace_df['ratio'] <= 0]) / len(trace_df)
0.811
必须有更 Pythonic 或至少优雅的方式来做到这一点。
查找列的百分比的最 pythonic 方法是简单地取布尔表达式的平均值。
(trace_df['ratio'] > 0).mean()
Ted 的回答很好,当然,只是将此回复视为对此的阐述。如果存在缺失值(通常存在),请注意它们也将被视为 False,因为 pandas 仅跟踪浮点数的缺失值,而不是布尔值。
ser = pd.Series([-1,1,np.nan])
(ser > 0).mean()
0.33333333333333331
同样,只有在没有缺失值的情况下,Jezrael 提出的好的观点才适用于 Ted 的回答。 (在这种情况下,您将得到 .333 + .333 != 1)
这不一定是错误的(它与您的答案产生的结果相同),但如果您有缺失值,您可能更愿意在 Ted 的答案中添加一些额外的代码:
(ser[ser.notnull()] > 0).mean()
0.5
我希望这不会给人留下错觉,但我认为这里值得注意,因为 mean()
的默认行为是排除缺失值,但是当您采用布尔值的平均值时这实际上是在包含缺失值,可能会导致意外结果。
是否有一个函数可以告诉 pandas DataFrame 中匹配的百分比或数量,而无需执行类似这样的操作...
len(trace_df[trace_df['ratio'] > 0]) / len(trace_df)
0.189
len(trace_df[trace_df['ratio'] <= 0]) / len(trace_df)
0.811
必须有更 Pythonic 或至少优雅的方式来做到这一点。
查找列的百分比的最 pythonic 方法是简单地取布尔表达式的平均值。
(trace_df['ratio'] > 0).mean()
Ted 的回答很好,当然,只是将此回复视为对此的阐述。如果存在缺失值(通常存在),请注意它们也将被视为 False,因为 pandas 仅跟踪浮点数的缺失值,而不是布尔值。
ser = pd.Series([-1,1,np.nan])
(ser > 0).mean()
0.33333333333333331
同样,只有在没有缺失值的情况下,Jezrael 提出的好的观点才适用于 Ted 的回答。 (在这种情况下,您将得到 .333 + .333 != 1)
这不一定是错误的(它与您的答案产生的结果相同),但如果您有缺失值,您可能更愿意在 Ted 的答案中添加一些额外的代码:
(ser[ser.notnull()] > 0).mean()
0.5
我希望这不会给人留下错觉,但我认为这里值得注意,因为 mean()
的默认行为是排除缺失值,但是当您采用布尔值的平均值时这实际上是在包含缺失值,可能会导致意外结果。