似乎现有df并没有简单选取列名中带有特定字符的列并进行修改的函数,虽然通过
df.filter(like="xxx")
可以获得筛选出的数据,但是这是df的一个拷贝,修改它并不会改变原来的df内容,可以使用
cols=df.filter(like="xxx").columns.values
for i in cols:
df[i]=yourfunction(df[i])
这样就可以曲线救国,获得它的列名了!再通过原来的df直接对列名索引,就可以完成修改了。但是仔细想想就会发现这个方法很蠢,因为筛选得到了df,却只用了索引,所以只当不用对原df修改时,可以使用df.filter函数,但是如果需要修改的话,该函数并不是很好的选择。此时我们直接获取原df的所有列名,并对列名先行筛选,就能达到同样的效果,而不用生成一个冗余的df。实际好用的方法是:
cols0=df.columns.values
cols=filter(lambda x: "xxx" in x,cols0)
看着更简洁的方法:
cols0=df.columns.values
cols=[col for col in cols0 if "xxx" in col]
实际上它们也都是for循环加上逻辑表达式实现的,只是对于筛选数据方面来说,提供了更简单的形式。这里的"xxx" in col可以换成其它任何对元素的筛选规则。
补充:在验证df.filter函数是否为拷贝的时候,注意到将df传参时,传的也是引用,所以其实
df[i]=yourfunction(df[i])
这一步如果是返回df[i]的话,并不需要返回再赋值,在函数内就已经对df[i]本身的内容修改过了。python很多类型默认传引用的点需要经常注意,很容易忘记导致出错。