从Dataframe中的所有列的列名中删除最后两个字符 - Pandas

时间:2016-05-05 22:48:49

标签: python string pandas dataframe

我正在使用用户ID键加入具有相同列/列名称的两个数据帧(a,b),并且在加入时,我必须提供后缀字符,以便创建它。以下是我使用的命令,

a.join(b,how='inner', on='userId',lsuffix="_1")

如果我不使用这个后缀,我会收到错误。但我不希望列名更改,因为这会导致运行其他分析时出现问题。所以我想删除这个" _1"结果数据框的所有列名称中的字符。任何人都可以建议我一种有效的方法来删除Pandas数据帧中所有列名称的最后两个字符吗?

由于

2 个答案:

答案 0 :(得分:9)

这段代码应该完成工作:

df.columns = pd.Index(map(lambda x : str(x)[:-2], df.columns))

编辑:这是一种更好的方法

df.rename(columns = lambda x : str(x)[:-2])

在这两种情况下,我们所做的只是迭代列并应用一些函数。在这种情况下,函数会将某些内容转换为字符串,并将所有内容转换为最后两个字符。

我确信还有其他一些方法可以做到这一点。

答案 1 :(得分:0)

您可以像这样使用str.rstrip

In [214]: import functools as ft

In [215]: f = ft.partial(np.random.choice, *[5, 3])

In [225]: df = pd.DataFrame({'a': f(), 'b': f(), 'c': f(), 'a_1': f(), 'b_1': f(), 'c_1': f()})

In [226]: df
Out[226]:
   a  b  c  a_1  b_1  c_1
0  4  2  0    2    3    2
1  0  0  3    2    1    1
2  4  0  4    4    4    3

In [227]: df.columns = df.columns.str.rstrip('_1')

In [228]: df
Out[228]:
   a  b  c  a  b  c
0  4  2  0  2  3  2
1  0  0  3  2  1  1
2  4  0  4  4  4  3

但是,如果您需要更灵活的东西(虽然可能会慢一些),则可以使用str.extract,借助正则表达式,它可以让您选择要保留的列名的哪一部分

In [216]: df = pd.DataFrame({f'{c}_{i}': f() for i in range(3) for c in 'abc'})

In [217]: df
Out[217]:
   a_0  b_0  c_0  a_1  b_1  c_1  a_2  b_2  c_2
0    0    1    0    2    2    4    0    0    3
1    0    0    3    1    4    2    4    3    2
2    2    0    1    0    0    2    2    2    1

In [223]: df.columns = df.columns.str.extract(r'(.*)_\d+')[0]

In [224]: df
Out[224]:
0  a  b  c  a  b  c  a  b  c
0  1  1  0  0  0  2  1  1  2
1  1  0  1  0  1  2  0  4  1
2  1  3  1  3  4  2  0  1  1

使用df.columns.str的想法来自this答案