Python 从Pandas中的数据帧行中查找最频繁的值

Python 从Pandas中的数据帧行中查找最频繁的值,python,pandas,dataframe,Python,Pandas,Dataframe,在一个数据帧中,我想创建另一个列,该列输出来自行中不同列的最频繁值 A B C D foo bar baz foo egg bacon egg egg bacon egg foo baz “E”列必须从类似的行中输出频繁值 E foo egg 如何在Python中执行此操作?重新创建您的问题: df = pd.DataFrame( { 'A' : ['foo', 'egg', 'bacon'], 'B' : ['bar',

在一个数据帧中,我想创建另一个列,该列输出来自行中不同列的最频繁值

A    B    C   D
foo  bar  baz foo
egg  bacon egg egg
bacon egg foo  baz
“E”列必须从类似的行中输出频繁值

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]
输出:

    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替换为egg,baz替换为bacon,我们将得到以下结果:

    0      1
0   foo    NaN
1   egg    NaN
2   bacon  egg
如您所见,现在结果集只有两个元素,这意味着联系在培根和鸡蛋之间

如何检测领带?

df.mode(axis=1)
    0      1       2       3
0   foo    NaN     NaN     NaN
1   egg    NaN     NaN     NaN
2   bacon  baz     egg     foo
让我们使用不包含列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转换数据帧,并检查是否有不包含NAN的行

df_mask = df_m.T.notna().any()
df_mask
0    False
1    False
2     True
dtype: bool
现在我们有一系列的布尔人。我们可以使用此掩码覆盖以前的列

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

通过以下方式重新创建您的问题:

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]
输出:

    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替换为egg,baz替换为bacon,我们将得到以下结果:

    0      1
0   foo    NaN
1   egg    NaN
2   bacon  egg
如您所见,现在结果集只有两个元素,这意味着联系在培根和鸡蛋之间

如何检测领带?

df.mode(axis=1)
    0      1       2       3
0   foo    NaN     NaN     NaN
1   egg    NaN     NaN     NaN
2   bacon  baz     egg     foo
让我们使用不包含列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转换数据帧,并检查是否有不包含NAN的行

df_mask = df_m.T.notna().any()
df_mask
0    False
1    False
2     True
dtype: bool
现在我们有一系列的布尔人。我们可以使用此掩码覆盖以前的列

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

axis=1的模式不理解输出。axis=1的模式不理解输出。如果未找到频繁值,则必须返回第一列行中的值?在这种情况下,它返回一个按字母顺序排列的较低值。不,模式通过返回一组值来工作,即如果它与最常见的值有联系,它将返回2个值,这可以在模式的原始输出中看到(更新的示例)。我实现它的方法是简单地取第一个元素,因为您没有另外指定。我使用了这个公式。并且,A列的值为“Foo”,B列的值为“Bar”,C列的值为“Baz”。在这种情况下,上面的公式将输出“Bar”,但在这种情况下它应该输出“Foo”。如果每个值都是唯一的,则输出应该是第一列中的值。这不是选项。要实现这一点,您需要检查输出数据框中的NA。我更新了我的答案以适应您的问题:)如果找不到频繁值,它必须返回第一列行中的值?在这种情况下,它返回一个按字母顺序排列的较低值。不,模式通过返回一组值来工作,即如果它与最常见的值有联系,它将返回2个值,这可以在模式的原始输出中看到(更新的示例)。我实现它的方法是简单地取第一个元素,因为您没有另外指定。我使用了这个公式。并且,A列的值为“Foo”,B列的值为“Bar”,C列的值为“Baz”。在这种情况下,上面的公式将输出“Bar”,但在这种情况下它应该输出“Foo”。如果每个值都是唯一的,则输出应该是第一列中的值。这不是选项。要实现这一点,您需要检查输出数据框中的NA。我更新了我的答案以适应您的问题:)