【发布时间】:2019-05-24 13:11:07
【问题描述】:
我试图清理数据框中的列名,但只清理了一部分列。
尝试以某种方式替换数据帧切片上的列名时不起作用,这是为什么呢?
假设我们有以下数据框:
注意,底部是复制数据的可复制代码:
Value ColAfjkj ColBhuqwa ColCouiqw
0 1 a e i
1 2 b f j
2 3 c g k
3 4 d h l
我要清理列名(预期输出):
Value ColA ColB ColC
0 1 a e i
1 2 b f j
2 3 c g k
3 4 d h l
方法一:
我可以像这样得到干净的列名:
df.iloc[:, 1:].columns.str[:4]
Index(['ColA', 'ColB', 'ColC'], dtype='object')
或者
方法2:
s = df.iloc[:, 1:].columns
[col[:4] for col in s]
['ColA', 'ColB', 'ColC']
但是当我尝试覆盖列名时,什么也没有发生:
df.iloc[:, 1:].columns = df.iloc[:, 1:].columns.str[:4]
Value ColAfjkj ColBhuqwa ColCouiqw
0 1 a e i
1 2 b f j
2 3 c g k
3 4 d h l
第二种方法也一样:
s = df.iloc[:, 1:].columns
cols = [col[:4] for col in s]
df.iloc[:, 1:].columns = cols
Value ColAfjkj ColBhuqwa ColCouiqw
0 1 a e i
1 2 b f j
2 3 c g k
3 4 d h l
这确实有效,但您必须手动连接第一列的名称,这并不理想:
df.columns = ['Value'] + df.iloc[:, 1:].columns.str[:4].tolist()
Value ColA ColB ColC
0 1 a e i
1 2 b f j
2 3 c g k
3 4 d h l
有没有更简单的方法来实现这一点?我错过了什么吗?
复制数据框:
df = pd.DataFrame({'Value':[1,2,3,4],
'ColAfjkj':['a', 'b', 'c', 'd'],
'ColBhuqwa':['e', 'f', 'g', 'h'],
'ColCouiqw':['i', 'j', 'k', 'l']})
【问题讨论】:
-
我认为这行得通.. df.columns = [d.split('_')[0] for d in df.columns] ?
-
df.columns = df.columns.str.split('_').str[0]..? -
感谢@ChrisA 的建议,但它更多的是关于字符串切片,下划线不是一个很好的例子。我编辑了我的问题