首页 > 解决方案 > 如何过滤熊猫数据框中的行,其中列的值等于列表的某个值

问题描述

我有一个包含两列的数据框:一列用于 ID_number,另一列用于 week_number。它看起来像这样:

df1 = pd.DataFrame({'ID_number':[13, 13, 14, 14, 14, 15, 15,16], 'week_number':[1, 2, 1, 2, 3, 1, 4, 5]})

#   ID_number   week_number
#0  13  1
#1  13  2
#2  14  1
#3  14  2
#4  14  3
#5  15  1
#6  15  4
#7  16  5

我想为每个不同的 ID 选择周值为 2 和 3 的那些 ID,然后为数据制作标签。如果一个 ID 没有第 2 周和第 3 周,我将其标记为 1。否则,我将其标记为 0。

现在,我提出了一个相当不优雅的解决方案,但我确信必须有另一种方法:

def check_courier_week(df, field, weeks):
    weeks_not_provided = weeks
    new_df = df
    new_df['label'] = np.zeros(len(df))
    for c in np.unique(df[field]):
        tmp = df[df[field] == c]
        if len(np.unique(tmp.week_number.isin(weeks_not_provided))) == 1 and np.unique(np.unique(tmp.week_number.isin(weeks_not_provided))) == False:
            new_df['label'][df[field] == c] = 1
        else:
            new_df['label'][df[field] == c] = 0
    return new_df

关于如何改进的任何想法?我想可能有一个使用 groupby 的解决方案,但我想不出如何实现它。

生成的标签应为:

#   ID_number   week_number     label
#0  13  1   0.0
#1  13  2   0.0
#2  14  1   0.0
#3  14  2   0.0
#4  14  3   0.0
#5  15  1   1.0
#6  15  4   1.0
#7  16  5   1.0

谢谢!

标签: pythonpandasdataframepandas-groupby

解决方案


groupby_transform any

(~(df1['week_number'].isin([2,3])).groupby(df1['ID_number']).transform('any')).astype(int)
Out[39]: 
0    0
1    0
2    0
3    0
4    0
5    1
6    1
7    1
Name: week_number, dtype: int32

推荐阅读