代码之家  ›  专栏  ›  技术社区  ›  KubiK888

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

  •  1
  • KubiK888  · 技术社区  · 7 年前

    我想创建自己的函数,该函数扫描数据帧中用户指定的多个列,如果所有指定列均为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)
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   chrisaycock spacemanspiff    7 年前

    这个 np.all() 是你的朋友。

    self.df['temp'] = np.where(np.all(self.df[self.tag_var_list] == self.tag_value, axis=1), 1, 0)
    
        2
  •  2
  •   jezrael    7 年前

    我认为您可以创建布尔掩码列表的列表理解,然后 reduce 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

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