从 Pandas 中的列表匹配列时保留个案

Preserving Cases while Column Matching from List in Pandas

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

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']

我想 select 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  

您可以使用str.lower()将列名转换为小写,然后用isin方法构造一个逻辑序列到select列;列名称不会以这种方式更改:

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

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

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

请注意,此正则表达式方法还匹配包含 cols 列表中模式的列名,如果您想要忽略大小写的完全匹配,您可以在

中添加单词边界
df.filter(regex="(?i)\b"+"\b|\b".join(cols)+"\b")