我在下面有df:

  Hour                                      1     2
    CU0111-012379-H Output Energy, (Wh/h)   2.0  3.0
                    Lights (Wh)             4.0  5.0
                    Lights+Media (Wh)       0.0  0.0
                    Total Usage (h)         0.0  2.0
                    Lights (h)              0.0  1.0
                    Light+Media (h)         0.0   0.0
                    Battery Voltage, (V)   13.5  13.7
                    Max Watt, W             7.5   4.5


并且我在末尾添加了总计列:

col_list= list(df)
df['Total'] = df[col_list].sum(axis=1)

  Hour                                      1     2   Total
    CU0111-012379-H Output Energy, (Wh/h)   2.0  3.0   5.0
                    Lights (Wh)             4.0  5.0   9.0
                    Lights+Media (Wh)       0.0  0.0   0.0
                    Total Usage (h)         0.0  2.0   2.0
                    Lights (h)              0.0  1.0   1.0
                    Light+Media (h)         0.0   0.0  0.0
                    Battery Voltage, (V)   13.5  13.7  27.2
                    Max Watt, W             7.5   4.5  12.0


然而。我想获得总计1列中轴1的最大值,而不是总和:

 Battery Voltage, (V)
 Max Watt, W


这样df将是:

  Hour                                      1     2   Total/Max
    CU0111-012379-H Output Energy, (Wh/h)   2.0  3.0   5.0
                    Lights (Wh)             4.0  5.0   9.0
                    Lights+Media (Wh)       0.0  0.0   0.0
                    Total Usage (h)         0.0  2.0   2.0
                    Lights (h)              0.0  1.0   1.0
                    Light+Media (h)         0.0   0.0  0.0
                    Battery Voltage, (V)   13.5  13.7  13.7 <-max
                    Max Watt, W             7.5   4.5  7.5  <-max


一个恶魔般的初学者尝试可能看起来像这样:

df3['Total/Max'] = d3[col_list].sum(axis=1).df3.groupby(level=1).df3['Battery Voltage, (v)'].transform(max)

最佳答案

您可以将numpy.whereisinget_level_values一起使用,以检查级别是否具有某些值,然后检查maxsum

L = ['Battery Voltage, (V)','Max Watt, W']

print (df.index.get_level_values(1).isin(L))
[False False False False False False  True  True]

df['Total/Max'] = np.where(df.index.get_level_values(1).isin(L),
                           df.max(axis=1),
                           df.sum(axis=1))

print (df)
                                          1     2  Total/Max
Hour
CU0111-012379-H Output Energy, (Wh/h)   2.0   3.0        5.0
                Lights (Wh)             4.0   5.0        9.0
                Lights+Media (Wh)       0.0   0.0        0.0
                Total Usage (h)         0.0   2.0        2.0
                Lights (h)              0.0   1.0        1.0
                Light+Media (h)         0.0   0.0        0.0
                Battery Voltage, (V)   13.5  13.7       13.7
                Max Watt, W             7.5   4.5        7.5


使用loc进行mask选择并应用maxsum的另一种解决方案,还需要~来反转boolean array

L = ['Battery Voltage, (V)','Max Watt, W']

mask = df.index.get_level_values(1).isin(L)

df.loc[mask, 'Total/Max'] = df[mask].max(axis=1)
df.loc[~mask, 'Total/Max'] = df[~mask].sum(axis=1)
print (df)
                                          1     2  Total/Max
Hour
CU0111-012379-H Output Energy, (Wh/h)   2.0   3.0        5.0
                Lights (Wh)             4.0   5.0        9.0
                Lights+Media (Wh)       0.0   0.0        0.0
                Total Usage (h)         0.0   2.0        2.0
                Lights (h)              0.0   1.0        1.0
                Light+Media (h)         0.0   0.0        0.0
                Battery Voltage, (V)   13.5  13.7       13.7
                Max Watt, W             7.5   4.5        7.5


通过评论编辑:需要带有另一个遮罩的双numpy.where

L = ['Battery Voltage, (V)','Max Watt, W']
mask1 = df.index.get_level_values(1).isin(L)
mask2 = df.index.get_level_values(1) == 'Lights (h)'

df['Total/Max/Min'] = np.where(mask1, df.max(axis=1),
                      np.where(mask2, df.min(axis=1), df.sum(axis=1)))

print (df)
                                          1     2  Total/Max/Min
Hour
CU0111-012379-H Output Energy, (Wh/h)   2.0   3.0            5.0
                Lights (Wh)             4.0   5.0            9.0
                Lights+Media (Wh)       0.0   0.0            0.0
                Total Usage (h)         0.0   2.0            2.0
                Lights (h)              0.0   1.0            0.0
                Light+Media (h)         0.0   0.0            0.0
                Battery Voltage, (V)   13.5  13.7           13.7
                Max Watt, W             7.5   4.5            7.5

关于python - Pandas 在新列中横穿轴线1的总和和最大值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42115431/

10-10 05:51