删除列名中不需要的字符串

时间:2019-03-22 06:19:25

标签: python string pandas

我有一个DataFrame,如下所示:

 df

              (0,'a1')   (0,'a2') (0,'b1')  (0,'b2')  (0,'c1')     
 date                                                 
 2006-01-01   -0.00001   -0.00001  0.00001   0.00001  0.00001
 2006-01-02    0.00001    0.00001  0.00001  -0.00001  0.00001
 2006-01-03   -0.00001   -0.00001  0.00001   0.00001  0.00001
 2006-01-04    0.00001   -0.00001  0.00001   0.00001  0.00001
 2006-01-05    0.00001    0.00001  0.00001   0.00001  0.00001

我希望列名称仅为a1,a2,b1,b2,c1等,但不确定如何。

删除列名中其他内容的最佳方法是什么?

任何帮助都会很棒!

3 个答案:

答案 0 :(得分:3)

如果列名中的元组通过str与可迭代对象一起使用索引:

df.columns = df.columns.str[1]

如果是字符串:

df.columns = df.columns.str.split(',').str[1].str.rstrip(')')    

Series.str.extract

df.columns = df.columns.str.extract(",'(.*)'\)", expand=False)
print (df)
                 a1       a2       b1       b2       c1
2006-01-01 -0.00001 -0.00001  0.00001  0.00001  0.00001
2006-01-02  0.00001  0.00001  0.00001 -0.00001  0.00001
2006-01-03 -0.00001 -0.00001  0.00001  0.00001  0.00001
2006-01-04  0.00001 -0.00001  0.00001  0.00001  0.00001
2006-01-05  0.00001  0.00001  0.00001  0.00001  0.00001

感谢@Jon Clements提供另一种解决方案:

df.columns = df.columns.map(ast.literal_eval).get_level_values(1)

答案 1 :(得分:1)

或使用rename

df = df.rename(columns=lambda x: x.split(',')[1][1:-2])

如果它们是元组:

df = df.rename(columns=lambda x: x[1])

现在:

print(df)

将符合预期。

答案 2 :(得分:0)

df.columns = list(map(lambda x: x.split(',')[1].lstrip("'").rstrip("')"), [x for x in list(df)]))