【问题标题】:Renaming tuple column name in dataframe重命名数据框中的元组列名
【发布时间】:2017-04-08 04:05:32
【问题描述】:

我是 python 和 pandas 的新手。我附上了一张熊猫数据框的图片, 我需要知道如何从最后一列获取数据以及如何重命名最后一列。

【问题讨论】:

  • 如果你提供的是实际数据而不是数据图片,我会投票赞成这个问题。

标签: python python-3.x pandas


【解决方案1】:

你可以使用:

df = df.rename(columns = {df.columns[-1] : 'newname'})

或者:

df.columns = df.columns[:-1].tolist() + ['new_name']

似乎解决办法:

df.columns.values[-1] = 'newname'

有问题。因为重命名 pandas 函数后返回奇怪的错误。

对于从最后一列获取数据可以使用iloc按位置选择:

s = df.iloc[:,-1]

重命名后:

s1 = df['newname']
print (s1)

示例:

df = pd.DataFrame({'R':[7,8,9],
                   'T':[1,3,5],
                   'E':[5,3,6],
                   ('Z', 'a'):[7,4,3]})

print (df)
   E  T  R  (Z, a)
0  5  1  7       7
1  3  3  8       4
2  6  5  9       3

s = df.iloc[:,-1]
print (s)
0    7
1    4
2    3
Name: (Z, a), dtype: int64

df.columns = df.columns[:-1].tolist() + ['new_name']
print (df)
   E  T  R  new_name
0  5  1  7         7
1  3  3  8         4
2  6  5  9         3

df = df.rename(columns = {('Z', 'a') : 'newname'})
print (df)
   E  T  R  newname
0  5  1  7        7
1  3  3  8        4
2  6  5  9        3
s = df['newname']
print (s)
0    7
1    4
2    3
Name: newname, dtype: int64
df.columns.values[-1] = 'newname'
s = df['newname']
print (s)
>KeyError: 'newname'

【讨论】:

  • 很好,只是确保你看到它:-)。我总是希望你投票给你的良心。你也是。我希望你知道我完全尊重这一点。在这种情况下,我喜欢这个解决方案,因为它代表了我的想法。我会保持原样。希望我们很快就会看到更多问题。
【解决方案2】:

从最后一列获取数据

按照其他答案的建议,使用df.iloc[:,-1] 检索最后一列只有在它确实是最后一列时才能正常工作。

但是,使用像 -1 这样的绝对列位置并不是一个稳定的解决方案,即如果添加其他列,您的代码将会中断。

一种稳定的通用方法

首先,确保所有列名都是字符串:

# rename columns
df.columns = [str(s) for s in df.columns]
# access column by name
df['(vehicle_id, reservation_count)']

重命名最后一列

最好为所有列使用相似的列名,其中不带括号 - 使您的代码更具可读性,并使您的数据集更易于使用:

# access column by name
df['vehicle_id_reservation_count`]

这是对所有由元组命名的列的直接转换:

# rename columns
def rename(col):
    if isinstance(col, tuple):
        col = '_'.join(str(c) for c in col)
    return col
df.columns = map(rename, df.columns)

【讨论】:

  • 如果元组是字符串和浮点数的混合体,请改用:"col = '{}_{}'.format(col[0], col[1])"
  • @Superpronker 采用了您对任意长度元组的提示
【解决方案3】:

您可以删除最后一列并重新分配一个不同的名称。
从技术上讲,这并不是在重命名该列。但是,我认为它很直观。

使用@jezrael 的设置

df = pd.DataFrame({'R':[7,8,9],
                   'T':[1,3,5],
                   'E':[5,3,6],
                   ('Z', 'a'):[7,4,3]})

print(df)

   R  T  E  (Z, a)
0  7  1  5       7
1  8  3  3       4
2  9  5  6       3

如何获取最后一列?

你可以使用iloc

df.iloc[:, -1]

0    5
1    3
2    6
Name: c, dtype: int64

您可以在提取后重命名该列

df.iloc[:, -1].rename('newcolumn')

0    5
1    3
2    6
Name: newcolumn, dtype: int64

为了在数据框中重命名它,您可以采取多种方式。继续我开始的主题,即获取列,然后重命名:

选项 1
首先删除最后一列iloc[:, :-1]
使用join 添加上面引用的重命名列

df.iloc[:, :-1].join(df.iloc[:, -1].rename('newcolumn'))

   R  T  E  newname
0  7  1  5        7
1  8  3  3        4
2  9  5  6        3

选项 2
或者我们可以使用assign将其放回去并保存rename

df.iloc[:, :-1].assign(newname=df.iloc[:, -1])

   R  T  E  newname
0  7  1  5        7
1  8  3  3        4
2  9  5  6        3

【讨论】:

    【解决方案4】:

    用于更改列名

    columns=df.columns.values
    columns[-1]="Column name"
    

    从数据帧中获取数据

    您可以使用 loc、iloc 和 ix 方法。

    loc 用于使用标签获取值 iloc 用于使用索引获取值 ix 可以同时使用索引和标签来获取数据

    了解 loc 和 iloc http://pandas.pydata.org/pandas-docs/stable/dsintro.html#indexing-selection

    了解有关索引和选择数据的更多信息

    http://pandas.pydata.org/pandas-docs/stable/indexing.html

    【讨论】:

    • 嗯,我测试了您的解决方案,它返回奇怪的 keyerror - 请参阅我的答案底部。它对你有什么作用? df = pd.DataFrame({'R':[7,8,9], 'T':[1,3,5], 'E':[5,3,6], ('Z', 'a'):[7,4,3]}) print (df)df.columns.values[-1] = 'newname' s = df['newname'] print (s) ?
    • 我以为您想更改列名仅用于显示目的。抱歉,误解了。 @jezrael 给出了正确的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2014-11-23
    • 2017-12-28
    • 1970-01-01
    • 2013-09-04
    • 2012-04-28
    相关资源
    最近更新 更多