[英]Finding most frequent value from dataframe rows in Pandas
在數據框中,我想創建另一列,該列輸出來自一行中不同列的最頻繁值。
A B C D
foo bar baz foo
egg bacon egg egg
bacon egg foo baz
“E”列必須是 output 頻繁值從一行像
E
foo
egg
如何在 Python 中做到這一點?
重現您的問題:
df = pd.DataFrame(
{
'A' : ['foo', 'egg', 'bacon'],
'B' : ['bar', 'bacon', 'egg'],
'C' : ['baz', 'egg', 'foo'],
'D' : ['foo', 'egg', 'baz']
}
)
並解決問題
df['E'] = df.mode(axis=1)[0]
Output:
A B C D E
0 foo bar baz foo foo
1 egg bacon egg egg egg
2 bacon egg foo baz bacon
如果沒有一個最頻繁的元素會發生什么?
df.mode(axis=1)
0 1 2 3
0 foo NaN NaN NaN
1 egg NaN NaN NaN
2 bacon baz egg foo
正如您所看到的,當出現最頻繁時,它會返回最頻繁集中的值。 如果我分別在 C 和 D 列中將值 foo 換成雞蛋,將 baz 換成培根,我們會得到以下結果:
0 1
0 foo NaN
1 egg NaN
2 bacon egg
如您所見,現在結果集只有兩個元素,這意味着平局在培根和雞蛋之間。
如何檢測關系?
讓我們使用不包含 D 列的數據集。
df
A B C
0 foo bar baz
1 egg bacon egg
2 bacon egg foo
df_m = df.mode(axis=1)
df_m
0 1 2
0 bar baz foo
1 egg NaN NaN
2 bacon egg foo
df['D'] = df_m[0]
A B C D
0 foo bar baz bar
1 egg bacon egg egg
2 bacon egg foo bacon
我們可以利用 pandas 提供的notna()方法來創建掩碼來檢查哪些行不包含 NaN 值,即哪些行處於平局。
首先,我們必須刪除始終具有值的第一列。
df_m = df_m.drop(columns=0)
然后我們需要使用另一種方法.T轉換 dataframe ,並檢查任何不包含 NaN 的行。
df_mask = df_m.T.notna().any()
df_mask
0 False
1 False
2 True
dtype: bool
現在我們有一個 pandas 系列布爾值。 我們可以使用這個掩碼覆蓋之前的列。
df['D'][df_mask] = df['A'][df_mask]
A B C D
0 foo bar baz foo
1 egg bacon egg egg
2 bacon egg foo bacon
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.