首页 > 解决方案 > 可变数量列的多个条件

问题描述

我有一个熊猫数据框,有 2 个固定列和这两个列之后的可变列数。我需要更改第二列中的值,具体取决于其他列中的值。问题是我事先不知道我的数据框中会有多少额外的列,我需要设置一种灵活的方式来检查它们的值。

def validateAndSetSignals(self, signalsDf, datesReb):


        totSignals = pd.DataFrame(0, columns = ['TOT_SIGNAL','TRADING_DAY'], index = self.unqDates)
        for names in signalsDf.keys():
            tmpSign = signalsDf[names].sum(axis =1)
            totSignals[names] = tmpSign
            totSignals['TOT_SIGNAL'] = totSignals['TOT_SIGNAL'] + tmpSign




        for i in range (len(totSignals.columns) - 2):         
            totSignals.loc[totSignals[totSignals.columns[2:]] != 0, 'TRADING_DAY'] = 1

如您所见,'TOT_SIGNAL''TRADING_DAY'是固定列,而我可能有一个或多个,具体取决于一开始的 for 循环。然后我想检查至少一个附加列何时不同于 0,并将 column 设置为 1 'TRADING_DAY'

我遇到了麻烦,因为我无法创建特定条件,因为我事先不知道附加列的数量和名称。我尝试使用位置索引,因为它们都将在第二个之后,但它不起作用。有没有办法做到这一点?

标签: pythonpandasconditional-statements

解决方案


这是使用anymask不使用的解决方案apply

df = pd.DataFrame(index=range(8), columns = ['TOT_SIGNAL','TRADING_DAY']).join(pd.DataFrame(np.eye(8, 5)))

df.TRADING_DAY = df.TRADING_DAY.mask((df.iloc[:,2:] != 0).any(axis=1), 1)

结果:

  TOT_SIGNAL TRADING_DAY    0    1    2    3    4
0        NaN           1  1.0  0.0  0.0  0.0  0.0
1        NaN           1  0.0  1.0  0.0  0.0  0.0
2        NaN           1  0.0  0.0  1.0  0.0  0.0
3        NaN           1  0.0  0.0  0.0  1.0  0.0
4        NaN           1  0.0  0.0  0.0  0.0  1.0
5        NaN         NaN  0.0  0.0  0.0  0.0  0.0
6        NaN         NaN  0.0  0.0  0.0  0.0  0.0
7        NaN         NaN  0.0  0.0  0.0  0.0  0.0

推荐阅读