多重条件数据调整

2024-06-28 11:28:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个df:

                                    Species Status     T1     T2  T3
0                                  Kentucky      L   96.0   88.0  79.0
1                                    Eupesu      L    0.0    2.0   3.0
2                                  Serrated      L    1.0    4.0   2.0
3                              Smooth_Brome      L    2.0    0.0   1.0
4                                        U1      L    3.0    6.0  10.0
Total                                               102.0  100.0  95.0

我想写一个语句或函数,如果T1(102.0)的总数小于100,那么取100—在T1内的总值,并将该值加到最大值上。如果T1大于100,则取T1的总值,从100中减去,然后从T1内的最大值中减去该值。我想对T2T3的总数做同样的处理。基本上每列的总数应该是100。你知道吗

我一直在尝试使用以下代码:

if df.T1.Total < 100:
    df.T1.max()=(100-df.T1.Total)+df.T1.max()
if  df.T1.Total > 100: 
    df.T1.max()= df.T1.max()-(df.T1.Total-100) 
if df.T2.Total < 100:
    df.T2.max()=(100-df.T2.Total)+df.T2.max()
if  df.T2.Total > 100: 
    df.T2.max()=df.T2.max()-(df.T2.Total-100)
if df.T3.Total < 100:
    df.T3.max()=(100-df.T3.Total)+df.T3.max()
if  df.T3.Total > 100: 
    df.T3.max()=df.T3.max()-(df.T3.Total-100)
df.loc['Total']=df.sum()
print df

我想要的结果是:

                                    Species Status     T1     T2  T3
0                                  Kentucky      L   94.0   88.0  84.0
1                                    Eupesu      L    0.0    2.0   3.0
2                                  Serrated      L    1.0    4.0   2.0
3                              Smooth_Brome      L    2.0    0.0   1.0
4                                        U1      L    3.0    6.0  10.0
Total                                               100.0  100.0  100.0

但代码返回:

SyntaxError: can't assign to function call

我很肯定有一个更好的方法。你知道吗


Tags: dfifstatusmaxtotalspeciest1t3
2条回答

以下是如何调整值:

df = df.drop('Total').set_index(['Species', 'Status']) # recreating 'Total' and leaving only numerical columns
difference = 100 - df.sum() # adjustment values
for col, index in df.idxmax().items(): # works also if max() occurs in different rows
    df.loc[index, col] += difference[col] # adjusting each max value

要获得:

Species      Status                  
Kentucky     L       94.0  88.0  84.0
Eupesu       L        0.0   2.0   3.0
Serrated     L        1.0   4.0   2.0
Smooth_Brome L        2.0   0.0   1.0
U1           L        3.0   6.0  10.0

以便:

result = pd.concat([df.reset_index(), df.sum().to_frame().T]).fillna('')
result.index = result.index.tolist()[:-1] + ['Total']

收益率:

            Species Status     T1     T2     T3
0          Kentucky      L   94.0   88.0   84.0
1            Eupesu      L    0.0    2.0    3.0
2          Serrated      L    1.0    4.0    2.0
3      Smooth_Brome      L    2.0    0.0    1.0
4                U1      L    3.0    6.0   10.0
Total                       100.0  100.0  100.0

必须在数据帧上使用.loc方法:

if df.T1.sum() > 1:
    df.loc[df.T1 == df.T1.max(),'T1'] = df.T1.max()+df.T1.sum()
...

相关问题 更多 >