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。我更新了我的答案以适应您的问题:)