[英]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 個。然后astype
到int
-
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.