pandas 系列上的短路 numpy logical_and
Short circuit numpy logical_and on pandas series
我创建了一个掩码以在 pandas 数据框中使用:
mask = np.logical_and(
csv_df['time'].map(operator.attrgetter('hour')).isin(
hours_set),
csv_df['time'].map(lambda x: x.weekday_name[:3]).isin(
days_set))
csv_df = csv_df.loc[mask, :]
原来两个isin
系列的计算相当慢。上面的方法计算两个系列,然后将它们相加——是否有一种(惯用的)方法来使每个元素短路,因为第一个系列大部分是错误的,所以我们不需要计算其他系列的元素?
一个想法是:
mask = csv_df['time'].dt.hour.isin(hours_set) &
csv_df['time'].dt.strftime('%a').isin(days_set)
如果大多数值不匹配,另一个想法是过滤第一个,然后过滤第二个:
csv_df1 = csv_df.loc[csv_df['time'].dt.strftime('%a').isin(days_set)]
csv_df2 = csv_df1.loc[csv_df1['time'].dt.hour.isin(hours_set)]
我创建了一个掩码以在 pandas 数据框中使用:
mask = np.logical_and(
csv_df['time'].map(operator.attrgetter('hour')).isin(
hours_set),
csv_df['time'].map(lambda x: x.weekday_name[:3]).isin(
days_set))
csv_df = csv_df.loc[mask, :]
原来两个isin
系列的计算相当慢。上面的方法计算两个系列,然后将它们相加——是否有一种(惯用的)方法来使每个元素短路,因为第一个系列大部分是错误的,所以我们不需要计算其他系列的元素?
一个想法是:
mask = csv_df['time'].dt.hour.isin(hours_set) &
csv_df['time'].dt.strftime('%a').isin(days_set)
如果大多数值不匹配,另一个想法是过滤第一个,然后过滤第二个:
csv_df1 = csv_df.loc[csv_df['time'].dt.strftime('%a').isin(days_set)]
csv_df2 = csv_df1.loc[csv_df1['time'].dt.hour.isin(hours_set)]