首页 > 解决方案 > 同时选择和重命名列

问题描述

我环顾四周,但找不到解决方案。我们可以在R's dplyr一行代码中选择和重命名列。

select(Com=Commander,Sco=Score)

我正在尝试在 pandas 中做同样的事情,但还没有找到可行的解决方案!

假设我们有这个样本数据

# Create an example dataframe
data = {'Commander': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'], 
        'Date': ['2012, 02, 08', '2012, 02, 08', '2012, 02, 08', '2012, 02, 08', '2012, 02, 08'], 
        'Score': [4, 24, 31, 2, 3]}
df = pd.DataFrame(data, index = ['Cochice', 'Pima', 'Santa Cruz', 'Maricopa', 'Yuma'])
df


           Commander          Date  Score
Cochice        Jason  2012, 02, 08      4
Pima           Molly  2012, 02, 08     24
Santa Cruz      Tina  2012, 02, 08     31
Maricopa        Jake  2012, 02, 08      2
Yuma             Amy  2012, 02, 08      3

并想像这样选择和重命名 Commander 和 Score 列

df[['Com'=='Commander','Sco'=='Score']]

ValueError:项目错误长度为 2 而不是 5。

我怎样才能做到这一点 ?

标签: pythonrpandasdplyr

解决方案


有点晚了,也许你已经弄清楚了,但我遇到了同样的问题,这里的答案让我大部分时间都在使用我使用的解决方案。

“如何添加要选择的范围”的最短答案是将选定列的列表传递给重命名操作的结果数据框:

df.rename(columns = {"Com" : "Commander", "Sco":"Score"})[['Com', 'Sco']]

              Com  Sco
Cochice     Jason    4
Pima        Molly   24
Santa Cruz   Tina   31
Maricopa     Jake    2
Yuma          Amy    3

但是重写列名有点繁琐,对吧?所以你可以用字典初始化重命名:

selector_d = {'Commander': 'Com', 'Score': 'Sco'}

并将其传递给重命名选择操作:

df.rename(columns=selector_d)[[*selector_d.values()]]
              Com  Sco
Cochice     Jason    4
Pima        Molly   24
Santa Cruz   Tina   31
Maricopa     Jake    2
Yuma          Amy    3

我的情况接近于此 - 我有不想重命名的列,但我确实想选择它们。这可以通过在重命名/选择字典中包含列来完成,但使用相同的名称。

这是添加另一列的整个过程:

data = {
    'Commander': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
    'Date': ['2012, 02, 08', '2012, 02, 08', '2012, 02, 08',
             '2012, 02, 08', '2012, 02, 08'],
    'Score': [4, 24, 31, 2, 3],
    'Team': ['Green', 'Yellow', 'Green', 'Yellow', 'Yellow'],
}
df = pd.DataFrame(data, index=['Cochice', 'Pima', 'Santa Cruz', 'Maricopa', 'Yuma'])
df

           Commander          Date  Score    Team
Cochice        Jason  2012, 02, 08      4   Green
Pima           Molly  2012, 02, 08     24  Yellow
Santa Cruz      Tina  2012, 02, 08     31   Green
Maricopa        Jake  2012, 02, 08      2  Yellow
Yuma             Amy  2012, 02, 08      3  Yellow

selector_d = {'Team': 'Team', 'Commander': 'Com', 'Score': 'Sco'}

df.rename(columns=selector_d)[[*selector_d.values()]]

              Team    Com  Sco
Cochice      Green  Jason    4
Pima        Yellow  Molly   24
Santa Cruz   Green   Tina   31
Maricopa    Yellow   Jake    2
Yuma        Yellow    Amy    3

如您所见,这还允许对最终数据框中的列进行重新排序。

根据@Hedge92 的评论,于 2021-08-28 编辑

实际上,您不需要双括号来从中选择列selector_d.values(),如下所示:

df.rename(columns=selector_d)[[*selector_d.values()]].equals(
    df.rename(columns=selector_d)[selector_d.values()]
)
True

因此,df.rename(columns=selector_d)[selector_d.values()]选择新列就足够了。


推荐阅读