多条件数据调整

时间:2016-06-13 23:15:09

标签: python pandas dataframe

我有这样的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

我非常确定首先有更好的方法来做到这一点。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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