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