pandas DataFrame 列中的布尔运算

Posted

技术标签:

【中文标题】pandas DataFrame 列中的布尔运算【英文标题】:Boolean operation in pandas DataFrame columns 【发布时间】:2018-11-25 11:50:30 【问题描述】:

我正在尝试找出我的 DataFrame 列中是否存在特定列,但我遇到了一些问题。

我的工作:使用布尔运算“not in”(我尝试过 any()、all()、“in”)来查找特定的列标题,但它似乎无法正常工作!

假设我的 DataFrame 列标题是:

df.columns = ['El-array', 'a', 'b', 'm', 'n', 'Rho', 'dev', 'ip', 'sp', 'vp', 'i',
   'M1', 'M2', 'M3', 'M4', 'M5', 'M6', 'M7', 'M8', 'M9', 'M10', 'M11',
   'M12', 'M13', 'M14', 'M15', 'M16', 'M17', 'M18', 'M19', 'M20', 'TM1',
   'TM2', 'resist', 'DC_slope']

我正在尝试查看是否所有的“M1”、“M2”、...“M20”和“TM1”都在那里。如果缺少一个或多个代码将不起作用。

所以我说:

    if any(['M1','M2','M3','M4','M5','M6','M7','M8','M9','M10','M11',
        'M12','M13','M14','M15','M16','M17','M18','M19','M20', 'TM1']) not in df.columns: 
        print('Incomplete dataset')

现在,假设 df 具有所有询问的列标题,if 语句仍然显示“不完整的数据集”消息!!我也尝试过“all() not in”但结果相同!!我也尝试过:

if 'M1' and 'M2' and ... and 'M20' and 'TM1' in df.columns:
    "Do this"
elif:
    print('Incomplete dataset')

if 'M1' or 'M2' or ... or 'M20' and 'TM1' not in df.columns:
    print('Incomplete dataset')
elif:
    "Do this"

仍然打印不完整的数据集!!


现在对于一个真正不完整的数据集,我也得到了相同的结果!!

【问题讨论】:

关于 python 工作原理的一些建议:if any(['M1','M2',...'M19','M20', 'TM1']) not in df.columns 确实在做if True not in df.columns 因为any(['M1','M2',...'M19','M20', 'TM1']) == True AND/OR in Python?的可能重复 【参考方案1】:

您对anyor 的工作方式存在根本性的误解。我建议回去看看我链接到的文档。

你想要:

names = ['M1','M2','M3','M4','M5','M6','M7','M8','M9','M10','M11',
        'M12','M13','M14','M15','M16','M17','M18','M19','M20', 'TM1']
if any(name not in df.columns for name in names):
    ...
else:
    print('incompatable dataset')

或者(这实际上只是为了最小的性能提升),您可以使用set difference(返回除names 之外的所有值,但不返回df.columns):

if not set(names) - set(df.columns):
   ...

【讨论】:

以上是关于pandas DataFrame 列中的布尔运算的主要内容,如果未能解决你的问题,请参考以下文章

pandas 怎么根据另一个dataframe来筛选

使用 pandas 重命名数据框列中的元素

《Pandas Cookbook》第02章 DataFrame基本操作

pandas将dataframe数据列中的年月日列组合成单一的日期数据列实战

Pandas DataFrame:根据条件替换列中的所有值

Pandas映射(转化)dataframe中的布尔值True和False值到1和0数值使用replace函数