从 Dataframe 中所有列的列名中删除最后两个字符 - Pandas
Posted
技术标签:
【中文标题】从 Dataframe 中所有列的列名中删除最后两个字符 - Pandas【英文标题】:Remove last two characters from column names of all the columns in Dataframe - Pandas 【发布时间】:2016-08-31 21:17:47 【问题描述】:我正在使用用户 ID 键加入具有相同列/列名的两个数据框 (a,b),并且在加入时,我必须提供后缀字符才能创建它。以下是我使用的命令,
a.join(b,how='inner', on='userId',lsuffix="_1")
如果我不使用这个后缀,我会出错。但我不希望更改列名,因为这会在运行其他分析时导致问题。所以我想从结果数据框的所有列名中删除这个“_1”字符。有人可以建议我一种有效的方法来删除 Pandas 数据框中所有列名称的最后两个字符吗?
谢谢
【问题讨论】:
你能重命名列吗? @JoeR 我有大约 76 列和 50 个这样的数据框。所以手动操作不是解决办法! 【参考方案1】:这个 sn-p 应该可以完成工作:
df.columns = pd.Index(map(lambda x : str(x)[:-2], df.columns))
编辑:这是一种更好的方法
df.rename(columns = lambda x : str(x)[:-2])
在这两种情况下,我们所做的只是遍历列并应用一些函数。在这种情况下,该函数将某些内容转换为字符串,并将所有内容提取到最后两个字符。
我相信您还有其他几种方法可以做到这一点。
【讨论】:
正如@Alexander 指出的那样,您确实需要具有唯一的列名才能使其工作。如果所有非连接键一开始都是唯一的,您应该只排除后缀。如果您收到错误,那是因为您的名称重叠并且未定义“加入”的概念。您可能想要发布一些示例数据,因为听起来您遇到了其他一些导致混淆的问题(例如如何或何时使用联接)。【参考方案2】:你可以像这样使用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的回答
【讨论】:
以上是关于从 Dataframe 中所有列的列名中删除最后两个字符 - Pandas的主要内容,如果未能解决你的问题,请参考以下文章
pandas删除数据行中的重复数据行基于dataframe所有列删除重复行基于特定数据列或者列的作何删除重复行删除重复行并保留重复行中的最后一行pandas删除所有重复行(不进行数据保留)