我有一個如下的資料框:
import pandas as pd
# intialise data of lists.
data = {'Name':['Tom', 'nick', 'krish', 'jack'],
'Book1':[20, 21, 19, 18],
'Book2':[20,'', 12, 20],
'Book3':[31, 21, 17, 16],
'Book4':[31, 19, 18, 16]}
# Create DataFrame
df = pd.DataFrame(data)
# Print the output.
print(df)
Name Book1 Book2 Book3 Book4
Tom 20 20 31 31
nick 21 21 19
krish 19 12 17 18
jack 18 20 16 16
我希望得到以下比較 Book1、Book2、Book3 和 Book4 列的輸出。對于行 Tom 輸出,有兩個 20 和兩個 31,因為值的數量相等,所以在這種情況下,它會更喜歡第一個值,即 Book1,因此輸出列是 20。對于行 nick,有兩個數字 21 和一個數字 19,因此它將采用出現次數最多的輸出列,即編號 21。而對于 krish 行,沒有重復的數字,因此我想將輸出列修復為“混合”。
輸出列如下:
Name Book1 Book2 Book3 Book4 Output
Tom 20 20 31 31 20
nick 21 21 19 21
krish 19 12 17 18 Mix
jack 18 20 16 16 16
有人有想法嗎?我看到有模式功能,但不適用于這種情況,請幫忙,謝謝
uj5u.com熱心網友回復:
使用value_counts:
max_val = lambda x: x.value_counts().index[0] \
if x.value_counts().iloc[0] > 1 else 'Mix'
df['Output'] = df.filter(like='Book').apply(max_val, axis=1)
print(df)
# Output:
Name Book1 Book2 Book3 Book4 Output
0 Tom 20 20 31 31 20
1 nick 21 21 19 21
2 krish 19 12 17 18 Mix
3 jack 18 20 16 16 16
更新
如果使用Python >= 3.8,則可以使用 walrus 運算子(避免重復呼叫value_counts:
max_val = lambda x: v.index[0] if (v := x.value_counts()).iloc[0] > 1 else 'Mix'
df['Output'] = df.filter(like='Book').apply(max_val, axis=1)
uj5u.com熱心網友回復:
我們可以使用您的想法mode來獲得您想要的輸出。首先,我們需要將相關列轉換為數值資料型別:
temp = (df
.filter(like='Book')
.apply(pd.to_numeric)
.mode(1)
)
# compute for values
# nulls exist only if there are duplicates
output = np.where(temp.notna().all(1),
# value if True
'Mix',
# if False, pick the first modal value,
temp.iloc[:, 0])
df.assign(output = output)
Name Book1 Book2 Book3 Book4 output
0 Tom 20 20 31 31 20.0
1 nick 21 21 19 21.0
2 krish 19 12 17 18 Mix
3 jack 18 20 16 16 16.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/367998.html
