遍历行并比较每一行列的值

时间:2020-09-06 07:30:09

标签: python pandas

我有一个数据框df,其中有2列和3000行。列名称为'1''2'

我想再添加2列。第一列遍历每一行,比较每一行中第1列和第2列的数据,然后输入具有最高值的列名。

例如,如果在第500行,列'2'的值大于'1',那么新的第一列将包含2。类似地,新的第二列将具有第二个最大值的第二列名称。 我们可以对任意数量的列(而不是仅2个)做一些通用的事情,因为我可能需要增加列数。

2 个答案:

答案 0 :(得分:1)

您可以直接比较两列,并在数据框本身中创建一个新列,

In [27]: df = pd.DataFrame(np.random.rand(20,2))
In [28]: df.columns = [1,2]
In [29]: df["Largest"] = pd.DataFrame(df[2]>df[1]).astype(int)+1

In [30]: df
Out[30]:
           1         2  Largest
0   0.315593  0.854372        2
1   0.067363  0.312327        2
2   0.650353  0.480793        1
3   0.653142  0.539709        1
4   0.077920  0.660042        2
5   0.676348  0.676716        2
6   0.252659  0.273548        2
7   0.146799  0.013372        1
8   0.891063  0.596015        1
9   0.054572  0.619679        2
10  0.311369  0.056108        1
11  0.288234  0.148597        1
12  0.056473  0.112157        2
13  0.263283  0.843832        2
14  0.098666  0.882066        2
15  0.655854  0.664619        2
16  0.873427  0.722233        1
17  0.421701  0.768081        2
18  0.303395  0.625726        2
19  0.648762  0.606731        1

类似地,您可以创建第二列。

对于一般情况,您可以使用np.argsort对列进行排名。

In [159]: ranks = df.apply(np.argsort, axis=1)
In [160]: ranks
Out[160]:
   0  1  2  3  4
0  2  3  4  1  0
1  3  1  4  2  0
2  2  4  1  0  3
3  3  2  4  0  1
4  4  1  3  0  2

答案 1 :(得分:0)

以下应能工作。也许还有更多的Python方式:

df2=df.copy()
df2['highest']=0
df2['second_highest']=0
for i in range(len(df)):
    l=sorted([(x, df.iloc[i][x]) for x in df.columns], key=lambda y: y[1])
    df2['highest'].iloc[i]=l[-1][0]
    df2['second_highest'].iloc[i]=l[-2][0]
print(df2)