在任何列中查找字符串以获取与条件匹配的行号

时间:2018-08-08 13:31:19

标签: python excel pandas dataframe

这里的大多数问题与在特定列中找到诸如字符串之类的模式并对其进行处理有关。但是,如果我不知道该专栏怎么办?
链接到特定列的Q / A:Link

我尝试比较两个数据框,以确保它们匹配,没有添加列或删除行。这些文件之一就像模板。一组代表值范围的地方。

示例:

template = pd.DataFrame(
        {'Headline': ['Subheading', '', 'Animal', 'Tiger', 'Bird', 'Lion'],
         'Headline2': ['', 'Weight', 2017, 'group1', 'group2', 'group3'],
         'Headline3': ['', '', 2018, 'group1', 'group2', 'group3']
         })

testfile = pd.DataFrame(
        {'Headline': ['Subheading', '', 'Animal', 'Tiger', 'Bird', 'Lion'],
         'Headline2': ['', 'Weight', 2017, 150, 15, 201],
         'Headline3': ['', '', 2018, 152, 12, 198]
         })

     Headline Headline2 Headline3
0  Subheading                    
1                Weight          
2      Animal      2017      2018
3       Tiger    group1    group1
4        Bird    group2    group2
5        Lion    group3    group3

     Headline Headline2 Headline3
0  Subheading                    
1                Weight          
2      Animal      2017      2018
3       Tiger       150       152
4        Bird        15        12
5        Lion       201       198

如果我这样做print((template == testfile).all().all()),那就是False

作为一个人,我知道第三到第五行是不同的,所以我想从比较中排除它们:

drop_r = [3, 4, 5]
template = template.drop(template.index[drop_r])
testfile = testfile.drop(testfile.index[drop_r])

然后我会得到print((template == testfile).all().all())True

在行包含组[n]的情况下,如何将所有行号放入对象drop_r中。

我需要找到模板中的行,其中子字符串“ group”出现在任何列中吗?

1 个答案:

答案 0 :(得分:2)

要检查是否可以在DataFrame中的任何位置找到'group',可以将其堆叠,请检查是否包含'group',然后获取索引。

import numpy as np

ids = np.unique(template.stack()[template.astype('str').stack().str.contains('group')].index.get_level_values(0))
#array([3, 4, 5], dtype=int64)

要查看不良行:

template.reindex(ids)
#  Headline Headline2 Headline3
#3    Tiger    group1    group1
#4     Bird    group2    group2
#5     Lion    group3    group3

要查看好的行:

template[~template.index.isin(ids)]
#     Headline Headline2 Headline3
#0  Subheading                    
#1                Weight          
#2      Animal      2017      2018