繁体   English   中英

Pandas 创建以 3 列为条件的掩码

[英]Pandas Create mask conditioned on 3 columns

我有一个 3M 行的 Dataframe。 我想创建一个掩码,它返回 3 列具有相等值的行和值的索引。

我认为这应该工作:

mask =  df.loc[ df['column_1'] == df['column_2'] & df['column_2'] == df['column_3'] & df['column_1'] == df['column_3'] ]

但是我得到the truth value of a series is ambiguous

我试过这个但得到同样的错误:

mask = df.loc[ np.any(df['column_1'] == df['column_2'] & df['column_2'] == df['column_3'] & df['column_1'] == df['column_3']) ]

mask = df.loc[ np.where(df['column_1'] == df['column_2'] & df['column_2'] == df['column_3'] & df['column_1'] == df['column_3']) ]

我很感激这方面的帮助

将条件放在括号内以确保操作的优先级,即比较 column1 和 colums2 是否相等,而不是第 2 列“和”column2

mask =  df.loc[ 
    (df['column_1'] == df['column_2']) & 
    (df['column_2'] == df['column_3']) & 
    (df['column_1'] == df['column_3']) ]

对于 dataframe:

df = (pd.DataFrame()
     .assign(a=['hej', 'ful'],
             b=['hej', 'ful'],
             c=['hej', 'ful']))

您可以使用:

(df
 .assign(same=lambda x: (x.a == x.b) & (x.b == x.c))
 .loc[lambda x: x.same == True]
)

另一种可能的解决方案:

df.loc[df.apply(lambda x: (x == x.min()).all(), axis=1)]

Output:

   col1  col2  col3
1     5     5     5
3     3     3     3

数据:

from io import StringIO

text = """
col1    col2    col3
1   3   2
5   5   5
2   5   1
3   3   3
3   2   5
"""

df = pd.read_csv(StringIO(text), sep='\s+')
df = df.astype(str)

完整代码:

import pandas as pd
import numpy as np
from io import StringIO

text = """
col1    col2    col3
1   3   2
5   5   5
2   5   1
3   3   3
3   2   5
"""

df = pd.read_csv(StringIO(text), sep='\s+')
df = df.astype(str)

df.loc[df.apply(lambda x: (x == x.min()).all(), axis=1)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM