我有这样的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
中的最大值中减去该值。我想对T2
和T3
的总和做同样的事情。基本上每列的总数应为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
我非常确定首先有更好的方法来做到这一点。
答案 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()
...