如何在一个数据框中基于另一列重命名特定列

时间:2020-04-22 08:40:58

标签: python pandas dataframe

我有一个数据框,如下所示:

df1: ACCOUNT_NAME Units GM 1. Sejal 12 12 2. Mohata 10 15

另一个数据框为:

df2: INPUT_FIELD TRANSL 1. ACCOUNT_NAME Account Name 2. GM Gross Margin 3. REVENUE Revenue 4. BU Business Unit

如果INPUT_FIELD中存在值,我想将df1的列重命名为df2中的TRANSL值。

我尝试过: df1.columns = df1.columns.map(df2.set_index('INPUT_FIELD')['TRANSL'].get)

它将列重命名为: [“帐户名称”,无,“总保证金”]

我想在不使用相等运算符的情况下有选择地重命名列,因为该表将来可能会增加。

2 个答案:

答案 0 :(得分:1)

您可以使用Series.to_dict方法将系列df2["TRANSL"]转换为字典mappings,然后可以使用DataFrame.rename方法来重命名df1的列通过将mappings字典传递给columns方法的rename参数。

使用:

mappings = df2.set_index("INPUT_FIELD")["TRANSL"].to_dict()
df1.rename(columns=mappings, inplace=True)
print(df1)

此打印:

  Account Name  Units  Gross Margin
0        Sejal     12            12
1       Mohata     10            15

答案 1 :(得分:0)

您可以从df2.values轻松构建dict理解:

df1.rename(columns={i:j for i,j in df2.values})

给予:

    Account Name  Units  Gross Margin
1.0        Sejal     12            12
2.0       Mohata     10            15

重命名还接受映射器功能,因此您可以使用:

def mapper(x):
    trans = df2.loc[df2.INPUT_FIELD == x, 'TRANSL']
    return trans.iat[0] if len(trans)>0 else x
df1.rename(columns = mapper)

在我的测试中(使用timeit),它比dict方法更长。只有在df2中有1000行以上并且列名在第一行中时,它才会更快,因为那样一来它就不会扫描整个值数组。