从Pandas中的列表匹配列中保留案例

时间:2017-03-23 00:48:10

标签: python list pandas dataframe case-sensitive

我有一个数据框,其中的字符串具有不同的列名称大小写以及小写字符串列表。

a = [5, 5, 4, 6]
b = [4, 4, 4, 4]
c = [6, 8, 2, 3]
d = [8, 6, 4, 3]

df = pd.DataFrame({'a': a,
                   'B_B': b,
                   'CC_Cc': c,
                   'Dd_DdDd': d})

cols = ['b_b', 'cc_cc', 'dd_dddd']

我想在df中选择与cols中的字符串匹配的列,同时保留df中列的大小写。我已经能够将列名全部小写来匹配列名,但我不确定如何保存数据帧列的原始情况。

在这种情况下,我想创建一个新的数据框,其中只有来自keep cols的df中的列,但是它们的原始情况。我该怎么做呢?

期望的输出:

   B_B  CC_Cc  Dd_DdDd  
0    4      6        8  
1    4      8        6  
2    4      2        4  
3    4      3        3  

1 个答案:

答案 0 :(得分:2)

您可以使用str.lower()将列名转换为小写,然后使用isin方法构建逻辑系列以选择列;列名不会以这种方式改变:

df.loc[:, df.columns.str.lower().isin(cols)]

enter image description here

另一种方法是使用filter函数,在正则表达式中指定一个修饰符(?i)来忽略大小写:

df.filter(regex="(?i)" + "|".join(cols))

enter image description here

请注意,此正则表达式方法还匹配包含cols列表中的模式的列名称,如果您想要完全匹配忽略大小写,则可以在以下位置添加单词边界:

df.filter(regex="(?i)\\b"+"\\b|\\b".join(cols)+"\\b")