簡體   English   中英

查找 dataframe 行中的前 n 個值(Python)

[英]Find top n values in row of a dataframe (Python)

我想在 dataframe 的一行中找到前 n 個值。

實際例子:

data = {'First':  [1, 2,3],
        'Second': [2,1,5],
         'Third': [5,1,2]
        }
df = pd.DataFrame (data, columns = ['First','Second','Third'])

 First Second Third
0   1   2   5
1   2   1   3
2   3   5   2

我想遍歷每一行和 select 前 n 個值。 在此示例中,將前 2 個值替換為 1,將所有其他值替換為 0。

所以我想要的 output 看起來像:

 First Second Third
0   0   1   1
1   1   0   1
2   1   1   0

您可以使用df.rank並將方法設置為min並獲取大於a number of columns - 2(df.shape[1]-n)相同以獲得前 2 個。然后astypeint -

data = {'First':  [1, 2,3],
        'Second': [2,1,5],
         'Third': [5,3,2]
        }
df = pd.DataFrame (data, columns = ['First','Second','Third'])


n = 2 #define top n

(df.rank(1)>(df.shape[1]-n)).astype(int)
   First  Second  Third
0      0       1      1
1      1       0      1
2      1       1      0

替代方案:您也可以使用 numpy 來解決此問題。 雙 argsort 按行返回每個數字的排名順序。 在這種情況下,top n 的閾值將減少 1,因為排名是從 0 開始的。 -

new_data = (df.to_numpy().argsort(1).argsort()>(df.shape[1]-n-1)).astype(int)
df2 = pd.DataFrame(new_data, columns = ['First','Second','Third'])
print(df2)
   First  Second  Third
0      0       1      1
1      1       0      1
2      1       1      0

您可以創建一個助手 function 用於根據它們是否適合 top2 將值轉換為 0 或 1。 然后這個 function 可以通過apply方法應用到 dataframe 上。

import pandas as pd


def filter_top_2(row):
    top_2_items = sorted(row, reverse=True)[:2]
    return [
        1
        if x in top_2_items
        else 0
        for x in row
    ]



data = {
    'First':  [1, 2, 3],
    'Second': [2, 1, 5],
    'Third': [5, 1, 2]
}

df = pd.DataFrame(data)
print(df)
print(df.apply(filter_top_2, axis=1, result_type='broadcast'))

Output

   First  Second  Third
0      1       2      5
1      2       1      1
2      3       5      2
   First  Second  Third
0      0       1      1
1      1       1      1
2      1       1      0

一種使用等級的解決方案

out = df.rank(axis=1).lte(2)

從文檔中確定適合您的排名方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM