python - 如何使我修改后的 pandas/numpy .where 函数适应不同大小的列表参数?
问题描述
我想创建自己的函数来扫描数据框中的许多用户指定的列,如果所有指定的列 == 1,则该函数将创建一个新变量并将其分配为“1”,否则为 0。
在下面的代码中,如果用户输入的正是要扫描的两列,我会接受。
import numpy as np
class Tagger:
def __init__(self):
pass
def summing_all_tagger(self, df, tag_var_list, tag_value=1):
# This tagger creates a tag='1' if all variables in tag_var_list equals to tag_value; otherwise='0'
self.df = df
self.tag_var_list = tag_var_list
self.tag_value = tag_value
self.df['temp'] = np.where((self.df[self.tag_var_list[0]]==self.tag_value) &
(self.df[self.tag_var_list[1]]==self.tag_value), 1, 0)
return self.df_pin['temp']
然后我可以在 main.py 文件中调用它:
import pandas as pd
import datetime
import feature_tagger.feature_tagger as ft
tagger_obj = ft.Tagger()
df_pin['PIN_RX&TIME_TAG'] = tagger_obj.summing_all_tagger(df_pin, tag_var_list=['PIN_RX_TAG', 'PIN_TIME_TAG'], tag_value=1)
如何修改它以便用户可以输入任意数量的列名tag_var_list
?
如
df_pin['PIN_RX&TIME_TAG'] = tagger_obj.summing_all_tagger(df_pin, tag_var_list=['PIN_RX_TAG', 'PIN_TIME_TAG', 'PIN_NAME_TAG'], tag_value=1)
# or
df_pin['PIN_RX&TIME_TAG'] = tagger_obj.summing_all_tagger(df_pin, tag_var_list=['PIN_RX_TAG'], tag_value=1)
解决方案
我认为您可以为布尔掩码列表创建列表理解,然后将掩码减少为一个,并将0/1
列转换为整数:
L = [self.df[x]==self.tag_value for x in tag_var_list]
self.df['temp'] = np.logical_and.reduce(L).astype(int)
或DataFrame.all
将布尔掩码转换为integer
s:
self.df['temp'] = (self.df[self.tag_var_list] == self.tag_value).all(axis=1).astype(int)
推荐阅读
- python - 如何存储 DataFrame 的变量并使用它来发送电子邮件?
- php - GoDaddy 共享托管两个运行不同 php 版本的不同站点
- flutter - 调试模式下的 Chrome ......带来一个空白页面 - Flutter web
- azure - WebApp Azure Publish:我的 db-first WebApp (ASP.NET 4.8) 上出现 EF6 模型验证错误
- android - 发布版本 android 应用程序中的动画问题
- css - div 不显示背景颜色,但其他样式显示
- random - 选择不重复的随机数字块
- python-3.x - Pixiedust jupyter笔记本中的奇怪字符
- php - 根据下拉选择在文本框中显示值
- azure - Count VMs by resource groups when multiple subscriptions