python - 如何过滤熊猫数据框中的行,其中列的值等于列表的某个值
问题描述
我有一个包含两列的数据框:一列用于 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
谢谢!
解决方案
与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
推荐阅读
- java - 将 SSL 证书安装到 Java 密钥库时出现问题
- python - 如何使用机器人框架在终端中执行命令?
- windows - 如何获取在 windows .bat 文件中捕获的命令中的所有参数
- angular - 如何增加 ag-grid 中自定义过滤器列表的宽度?
- php - 当我使用输入标签作为提交按钮时如何更改占位符
- node.js - 多端点 Graphql
- php - 从单个 CSV 条目导入多个自定义字段值
- regex - 什么都不匹配的正则表达式字符类?
- vert.x - java.lang.IllegalArgumentException:无效类型:com.codahale.metrics.Timer$Context 类放入异步映射
- sql - 返回一组sql的第二条新闻记录