根据其他列切断数据框

时间:2019-10-09 11:35:00

标签: python pandas dataframe

示例数据:

dd = pd.DataFrame({
    'file': ['file1','file2','file3','file4','file5','file6','file7','file8','file9'],
    'prop1': [True,False,False,False,False,False,False,False,False],
    'prop2': [False,False,False,False,False,False,False,True,False],
    'prop3': [False,True,False,True,False,True,False,False,True]
})
file    prop1   prop2   prop3
0   file1   True    False   False
1   file2   False   False   True
2   file3   False   False   False
3   file4   False   False   True
4   file5   False   False   False
5   file6   False   False   True
6   file7   False   False   False
7   file8   False   True    False
8   file9   False   False   True

我需要将所有具有错误prop值(例如示例文件3、5、7)的行(在剪切后不应该在“ dd”数据框中删除)到另一个新数据框

3 个答案:

答案 0 :(得分:1)

  

使用anyall

摩根定律的简单应用

获取没有False的行

您需要DataFrame.any

def fun(list1,remove_element):
    while remove_element in list1:
        list1.remove(remove_element)
    return list1

或使用DataFrame.all

dd[dd[['prop1','prop2','prop3']].any(axis=1)]

输出:

dd[~(~dd[['prop1','prop2','prop3']]).all(axis=1)]

获取包含False的行

    file  prop1  prop2  prop3
0  file1   True  False  False
1  file2  False  False   True
3  file4  False  False   True
5  file6  False  False   True
7  file8  False   True  False
8  file9  False  False   True

或使用DataFrame.all

dd[~dd[['prop1','prop2','prop3']].any(axis=1)]

输出:

dd[(~dd[['prop1','prop2','prop3']]).all(axis=1)]

答案 1 :(得分:1)

使用DataFrame.any测试每列至少一个True,列表中的列名称为

mask = dd[['prop1','prop2','prop3']].any(axis=1)

或者所有列都没有第一个:

mask = dd.iloc[:, 1:].any(axis=1)

或在列名称中包含prop的列:

mask = dd.filter(like='prop').any(axis=1)

df1 = dd[mask]

如果需要删除行,请使用~来反转布尔掩码:

df2 = dd[~mask]

print (df1)
    file  prop1  prop2  prop3
0  file1   True  False  False
1  file2  False  False   True
3  file4  False  False   True
5  file6  False  False   True
7  file8  False   True  False
8  file9  False  False   True

print (df2)
    file  prop1  prop2  prop3
2  file3  False  False  False
4  file5  False  False  False
6  file7  False  False  False

答案 2 :(得分:0)

    {
  "naam": "Timmie Ruijgrok",
  "iban": "NL41ABNA9079565997",
  "straat": "Kuipersstraat",
  "straatnummer": 27,
  "postcode": "1074EK",
  "plaats": "Amsterdam"
}