我有一个Pandas Dataframe * df_next *,它是特定辖区的犯罪类型事件的每月汇总。例如,类似于:
| 识别号|年月日|共计|
| - ------|- ------|- ------|
| AL0010000|一九九一至零一年|小行星2024|
| AL0010000|一九九一至零二年|小行星3017|
| ...|...|...|
| 第0550300号|2018年11月|小行星30147|
| 第0550300号|2018年12月|小行星32148|
我想通过删除"总计"列中连续4个月的0值的行来减小 Dataframe 的大小。换句话说,如果一个ID连续4个月报告的犯罪总数为0,我想删除这4个月的数据块。我想对所有ID执行此操作。
我试过了
# Define a window size of 4
window_size = 4
# Apply a rolling window to the Total column for each ID
df_next['Total_rolling'] = df_next.groupby('ID')['Total'].rolling(window=window_size).reset_index(0, drop=True)
df_next['Remove'] = ((df_next['Total_rolling'].shift(window_size - 1) == 0) & (df_next['Total_rolling'] == 0))
# Filter out the rows where there are four consecutive 0's in the Total value for each ID
df_filtered = df_next[~df_next['Remove']]
但是,当我检查df_filtered时,我仍然有多个连续四个月犯罪总数为0的ID示例。
2条答案
按热度按时间20jt8wwn1#
注解代码
yqkkidmi2#
这将做我认为你的问题问:
说明:
ID, Year_Month
对原始 Dataframe 进行排序,添加isZero
列,其中布尔值指示Total
是否为0,并删除除ID, isZero
以外的所有列ID
组,将cumZeros
列与isZero
的cumsum
相加ID
组,添加cumZerosAtLastBreak
列,该列从cumZeros
复制具有cumZeros == cumZeros.shift(1)
的行的值,否则为NaN(这为我们提供了零的累计数量,但仅适用于标记零条纹中断的行)ID
组使用ffill
和fillna(0)
更新cumZerosAtLastBreak
列(并向下转换为int,只是为了保持逻辑一致性cumZeros - cumZerosAtLastBreak < 4
的行(即零条纹长度小于4的行)。样品输入:
输出: