首页 > 解决方案 > 如何使我修改后的 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)

标签: pythonpython-3.xpandasfunctionnumpy

解决方案


我认为您可以为布尔掩码列表创建列表理解,然后将掩码减少为一个,并将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将布尔掩码转换为integers:

self.df['temp'] = (self.df[self.tag_var_list] == self.tag_value).all(axis=1).astype(int)

推荐阅读