簡體   English   中英

從 Pandas 中的 dataframe 行中查找最常見的值

[英]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.

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