Pandas 重命名列

3

我正在尝试用数字结尾的前一个列名来重命名我的列,以使列唯一。有办法实现这个吗?

当前数据框:

Reconnaissance      Unnamed: 1          Resource Development    Unnamed: 3      Initial Access          Unnamed: 5  
Active Scanning     Scanning IP Blocks  Acquire Infrastructure  Botnet          Drive-by Compromise         NaN

期望达成:

Reconnaissance      Reconnaissance_1        Resource Development    Resource Development_1      Initial Access          Initial Access_1
Active Scanning     Scanning IP Blocks  Acquire Infrastructure  Botnet                      Drive-by Compromise         NaN
3个回答

4

如果需要重命名的是每一列中的第二列,您可以使用以下方法:

df = df.rename(columns = {df.columns[i]: f"{df.columns[i-1]}_1" for i in range(1, len(df.columns),2)})

3

您可以从列中创建一个 Series(因为 Index 对象没有 ffill 方法,这在此处很有用)。然后确定哪些列以 Unnamed 开头,将它们进行掩码处理,并使用 cumcount 确定要添加到末尾的数字(在可能存在多个连续的 Unnamed: 列的情况下),并使用 ffill 获取前一个未以 'Unnamed' 开头的列标签。将这个 Series 分配给这些列。

示例数据

import pandas as pd
import numpy as np

df = pd.DataFrame(columns=['Reconnaissance', 'Unnamed: 1', 'Resource Development',    
                           'Unnamed: 3', 'Initial Access', 'Unnamed: 5'],
                  data=1, index=[0])

代码

s = pd.Series(df.columns)

s = s.mask(s.str.startswith('Unnamed:'))
s = (s.ffill() 
     + s.groupby(s.notnull().cumsum()).cumcount().astype(str).radd('_').replace('_0', ''))

df.columns = s

print(df)

   Reconnaissance  Reconnaissance_1  Resource Development  Resource Development_1  Initial Access  Initial Access_1
0               1                 1                     1                       1               1                 1

以下是关于如何处理不规则间隔的“Unnamed:”列的另一个示例。
df = pd.DataFrame(columns=['a', 'Unnamed: 1', 'Unnamed: 2', 'b', 'c', 'Unnamed: 3'],
                  data=[np.arange(6)], index=[0])

#### Same code as above

print(df)
   a  a_1  a_2  b  c  c_1
0  0    1    2  3  4    5

0

要一次重命名所有列,您可以执行以下操作:

df.columns = [col1, col2, col3]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接