Python Pandas:获取每行中最小值的列名称,并获取与其余列相比的百分比差异
我有一个数据帧:Python Pandas:获取每行中最小值的列名称,并获取与其余列相比的百分比差异,python,pandas,Python,Pandas,我有一个数据帧: LF RF LR RR 11 22 33 44 23 43 23 12 33 23 12 43 我想完成的是一个计算(目的是确定每行中哪一列的值最低,并确定与其他cols平均值相比的百分比)。 例如: 识别r1中的最小值,即11和列名称(LF)。其余cols平均值为(22+33+44)/3=33。然后我们计算百分比差11/33=0.333 预期产出: LF RF LR RR Min_Col dif(%) 11 22 33 4
LF RF LR RR
11 22 33 44
23 43 23 12
33 23 12 43
我想完成的是一个计算(目的是确定每行中哪一列的值最低,并确定与其他cols平均值相比的百分比)。
例如:
识别r1中的最小值,即11和列名称(LF)。其余cols平均值为(22+33+44)/3=33。然后我们计算百分比差11/33=0.333
预期产出:
LF RF LR RR Min_Col dif(%)
11 22 33 44 LF 0.333
23 43 23 12 RR 0.404
33 23 12 43 LR 0.364
写出方程式的正确方法是:
(min_value)/(sum_rest_of_cols/3)
注意:我需要有一个列来指示每行中哪一列是最低的(这是一个识别问题的程序,因此在错误消息中,我们希望能够告诉用户哪一列是给出问题的列)
编辑:
我的代码(df_inter是我定位的原始df,仅用于获取执行此计算所需的列):
我的输出:
LF_Strut RF_Strut LR_Strut RR_Strut dif(%) Min_Col
truck_id
EX7057 0.000000 0.000000 0.000000 0.000000 0.0000 LF_Strut
EX7105 0.000000 0.000000 0.000000 0.000000 0.0000 LF_Strut
EX7106 0.000000 0.000000 0.000000 0.000000 0.0000 LF_Strut
EX7107 0.000000 0.000000 0.000000 0.000000 0.0000 LF_Strut
TD6510 36588.000000 36587.000 36587.00000 36587.00 0.8204 RF_Strut
TD6511 36986.000000 36989.000 36987.00000 36989.00 0.8220 LF_Strut
TD6512 27704.000000 27705.000 27702.00000 27705.00 0.7757 LR_Strut
问题是:在计算TD6510(36587/((36587+36587+36588)/3))时=0.999999。。不是0.8204。我尝试复制0.8204的来源,但没有成功。谢谢所有人的帮助和支持 使用
idxmin
和df.mask()
和df.isin()
和df.min()
:
您只需进行常规计算,最小列由
idxmin
# find the mins in each row
mins = df.min(axis=1)
# compute mean of the other values
other_means = (df.sum(1) - mins).div(df.shape[1]-1)
(mins /other_means)*100
输出:
0 33.333333
1 40.449438
2 36.363636
dtype: float64
首先,我们使用
idxmin
df['dif(%)']=df.min(1)*3/(df.sum(1)-df.min(1))
df['Min_Col']=df.iloc[:,:-1].idxmin(1)
df
LF RF LR RR dif(%) Min_Col
0 11 22 33 44 0.333333 LF
1 23 43 23 12 0.404494 RR
2 33 23 12 43 0.363636 LR
我把文本写在一个名为“textfile.txt”的文件中。这应该是有用的:
import pandas as pd
df= pd.read_csv('textfile.txt', sep = ' ')
df['min'] = df[['LF','RF','LR','RR']].min(axis=1)
df['sum_3'] = df[['LF','RF','LR','RR']].sum(axis=1)- df['min']
df['sum_3_div3'] = df['sum_3']/3
df.idxmin(1)
谢谢,它可以为每一行获取最小值的列名。我仍然停留在如何执行计算Thanx上,这似乎是可行的。。我没有得到我期望的数字,但我相信问题在于我的df的安排方式。我正在修复它,我会再次确认。我没有得到预期的结果,我正在编辑原始问题以显示我的代码和我的输出非常感谢!在我添加了df['sum\u 3\u div3']=df['min']/(df['sum\u 3']]/3)
之后,这个功能运行得非常好。。救了我一天。Thanx,干杯
0 33.333333
1 40.449438
2 36.363636
dtype: float64
df['dif(%)']=df.min(1)*3/(df.sum(1)-df.min(1))
df['Min_Col']=df.iloc[:,:-1].idxmin(1)
df
LF RF LR RR dif(%) Min_Col
0 11 22 33 44 0.333333 LF
1 23 43 23 12 0.404494 RR
2 33 23 12 43 0.363636 LR
import pandas as pd
df= pd.read_csv('textfile.txt', sep = ' ')
df['min'] = df[['LF','RF','LR','RR']].min(axis=1)
df['sum_3'] = df[['LF','RF','LR','RR']].sum(axis=1)- df['min']
df['sum_3_div3'] = df['sum_3']/3