python - 如何使我修改后的 pandas/numpy .where 函数适应不同大小的列表参数?

标签 python python-3.x pandas function numpy

我想创建自己的函数来扫描数据框中的多个用户指定的列,如果所有指定的列 == 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)

最佳答案

np.all() 是你的 friend 。

self.df['temp'] = np.where(np.all(self.df[self.tag_var_list] == self.tag_value, axis=1), 1, 0)

关于python - 如何使我修改后的 pandas/numpy .where 函数适应不同大小的列表参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51914893/

相关文章:

Python 多处理 pylab 傅里叶

python - 如何在Python中从GITLAB读取csv文件(或任何文件)

python - 使用 boost-python 将 python 变量设置为 C++ 对象指针

python - 如何指定一个属性必须是一个(比方说)整数列表,而不仅仅是一个列表?

python - 对帖子的评论进行分页

python3 : how to print groupby. 最后()?

python - 在文件python中循环文本

python - 如何在python中获取字典的key

python - 模棱两可的系列的真值

python - 将字符串的 Pandas DataFrame 转换为直方图