从pandas DataFrame中删除列名包含特定字符串的列
问题的出现原因是,原始数据框中的列名称中可能包含特定的字符串,需要将包含该特定字符串的列从数据框中删除。在给定的示例中,需要删除列名中以'test'开头的列。
解决方法是通过使用列表推导式来创建一个新的列列表,其中不包含以'test'开头的列名。然后,将数据框重新赋值为只包含这些列的子集。
具体的代码解决方法如下:cols = [c for c in df.columns if c.lower()[:4] != 'test']
,这一行代码通过遍历列名列表,检查每个列名的前四个字符是否为'test'(不区分大小写),如果不是,则将该列名添加到新的列列表中。然后,通过将数据框重新赋值为只包含新的列列表的子集来删除原始数据框中包含特定字符串的列。
通过执行以上代码,可以得到一个新的数据框,其中不包含以'test'开头的列。在给定的示例中,最后的输出是:
toto riri 0 0.572528 0.144891 1 0.332540 0.741412
问题的出现是因为用户想要从一个pandas DataFrame中删除包含特定字符串的列。问题的解决方法是使用pandas的str.contains方法来进行匹配并删除相应的列。
具体的解决方法如下:
1. 对于以特定子字符串开头的列,可以使用str.startswith方法,示例如下:
df.columns.str.startswith('Test') df.loc[:,~df.columns.str.startswith('Test')]
以上代码将返回一个布尔数组,指示每个列是否以'Test'开头,然后使用loc方法选择所有不以'Test'开头的列。
2. 对于不区分大小写的匹配,可以使用基于正则表达式的str.contains方法,并指定^作为锚点,示例如下:
df.columns.str.contains('^test', case=False) df.loc[:,~df.columns.str.contains('^test', case=False)]
以上代码将返回一个布尔数组,指示每个列是否包含以'test'开头的字符串(不区分大小写),然后使用loc方法选择所有不包含以'test'开头的列。
3. 如果存在混合类型的列,并且希望忽略缺失值,可以在方法中指定na=False。
此外,还有一些其他的解决方法和补充说明:
- 如果想要将此方法与drop方法结合使用,可以使用以下代码:
df.drop(columns = df.columns[df.columns.str.startswith('Test')], inplace = True)
以上代码将使用drop方法删除所有以'Test'开头的列。
- 在解释为什么使用df.loc[:,~df.columns.str.startswith('Test')]而不是df.loc[df....]时,有一个问题提到了这一点。这是因为df.loc[:,~df.columns.str.startswith('Test')]是使用.loc方法来选择所有行,并选择所有不以'Test'开头的列。而df.loc[df....]将选择所有以'Test'开头的行。
- 有一个用户在测试数据中发现,对于以'_drop'结尾的列,接受的答案无法正常工作,但这个解决方法可以正常工作。
通过使用pandas的str.contains方法和str.startswith方法,可以轻松地从DataFrame中删除包含特定字符串的列。
问题:从pandas DataFrame中删除列名包含特定字符串的列。
原因:需要从DataFrame中删除列名包含特定字符串的列。
解决方法:可以使用以下方法之一来解决该问题。
方法一:
df = df[df.columns.drop(list(df.filter(regex='Test')))]
方法二:
df.drop(list(df.filter(regex='Test')), axis=1, inplace=True)
这两种方法比接受的答案更加优雅。为了更好地展示这行代码的作用,我们可以将`list(df.filter(regex='Test'))`提取出来。我也更倾向于使用`df.filter(regex='Test').columns`而不是转换成列表。
我真的很好奇,为什么有人说这个答案很“优雅”。我个人觉得这行代码相当晦涩,Python代码应该首先是可读的。而且它比第一个答案慢了两倍。它使用了`regex`关键字,而`like`关键字似乎更合适。
这实际上并不是一个很好的答案,不像人们所说的那样。`filter`的问题在于,它返回所有要删除的列的所有数据的副本。如果你只是将这个结果传递给`drop`(再次返回副本)是很浪费的……一个更好的解决方案是使用`str.startswith`(我在这里添加了一个答案)。
最简洁的版本是:
df.drop(columns=df.filter(like='SomeString').columns)
它返回一个不包含包含`"SomeString"`的列的DataFrame的副本。
对于多个条件,可以使用以下方法:
df.drop(df.filter(regex='Test|Rest|Best').columns, axis=1, inplace=True)
以上就是从pandas DataFrame中删除列名包含特定字符串的列的原因和解决方法。希望对你有所帮助!