【问题标题】:drop column based on a string condition根据字符串条件删除列
【发布时间】:2016-11-17 22:37:06
【问题描述】:

如何根据名称中的某个字符串删除数据框列?

例子:

           house1    house2    chair1  chair2
index
  1         foo       lee       sam      han
  2         fowler    smith     had      sid
  3         cle       meg       mag      mog

我想删除字符串中包含“chair”的列。 如何以有效的方式做到这一点? 谢谢。

【问题讨论】:

  • 这是一个有趣的问题!这么多选择...+1

标签: python string pandas dataframe


【解决方案1】:
df.drop([col for col in df.columns if 'chair' in col],axis=1,inplace=True)

【讨论】:

  • 无法决定我最喜欢哪一个@bernie
  • @Al_Iskander:如果您不使用基于正则表达式的解决方案,您将获得更好的性能,但我认为性能上的微小差异不值得讨价还价。无论如何,我是第一个答案;-)
【解决方案2】:

更新 2:

In [315]: df
Out[315]:
   3M110%  3M80% 6M90% 6M95% 1N90% 2M110% 3M95%
1     foo    lee   sam   han   aaa    aaa   fff
2  fowler  smith   had   sid   aaa    aaa   fff
3     cle    meg   mag   mog   aaa    aaa   fff

In [316]: df.loc[:, ~df.columns.str.contains('90|110')]
Out[316]:
   3M80% 6M95% 3M95%
1    lee   han   fff
2  smith   sid   fff
3    meg   mog   fff

更新:

In [40]: df
Out[40]:
   house1 house2 chair1 chair2 door1 window1 floor1
1     foo    lee    sam    han   aaa     aaa    fff
2  fowler  smith    had    sid   aaa     aaa    fff
3     cle    meg    mag    mog   aaa     aaa    fff

In [41]: df.filter(regex='^(?!(chair|door|window).*?)')
Out[41]:
   house1 house2 floor1
1     foo    lee    fff
2  fowler  smith    fff
3     cle    meg    fff

原答案:

这里有几个选择:

In [37]: df.drop(df.filter(like='chair').columns, 1)
Out[37]:
   house1 house2
1     foo    lee
2  fowler  smith
3     cle    meg

In [38]: df.filter(regex='^(?!chair.*)')
Out[38]:
   house1 house2
1     foo    lee
2  fowler  smith
3     cle    meg

【讨论】:

  • @MaxU,第一个版本也可以用于一行中的多个不同字符串吗?
  • @Al_Iskander,你说multiple different strings in one line 是什么意思?你能发布一个简短的例子吗?
  • 我的意思是,如果我有更多不同名称的列,除了“椅子”之外,我还想删除名称中包含“门”或“窗口”(或其他任何内容)的列。
  • @Al_Iskander,坦率地说,我更喜欢第二个选项,使用regex - 请参阅更新
  • @Al_Iskander,试试这个:df.filter(regex=r'^\d\w(?!(110|90).*?)')
【解决方案3】:

应该这样做:

df.drop(df.columns[df.columns.str.match(r'chair')], axis=1)


时间

MaxU 方法 2

【讨论】:

  • 我的做法略有不同... +1
  • @bernie 我打赌你的方式更快。检查。
  • 感谢您的检查!
【解决方案4】:

另一种选择:

import pandas as pd

df = pd.DataFrame({'house1':['foo','fowler','cle'],
                   'house2':['lee','smith','meg'],
                   'chair1':['sam','had','mag'],
                   'chair2':['han','sid','mog']})

mask = ['chair' not in x for x in df]

df = df[df.columns[mask]]

【讨论】:

  • 我同意,其他一些解决方案我从未想过,但仍然非常有效!
猜你喜欢
  • 2014-06-19
  • 1970-01-01
  • 2023-04-09
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多