Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何基于另一个数据帧重命名一个数据帧中的特定列_Python_Pandas_Dataframe - Fatal编程技术网

Python 如何基于另一个数据帧重命名一个数据帧中的特定列

Python 如何基于另一个数据帧重命名一个数据帧中的特定列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据帧,如下所示: df1: 账户名称单位总经理 1.塞哈尔12 2.莫哈塔10 15 另一个数据帧为: df2: 输入字段转换 1.帐户名帐户名 2.通用汽车毛利率 3.收入 4.BU业务部门 我想将df1的列重命名为df2中的TRANSL值,如果这些值出现在输入_字段中 我试过: df1.columns=df1.columns.map(df2.set\u index('INPUT\u FIELD')['TRANSL'].get) 它将列重命名为: [“账户名称”,无,“毛利率”] 我

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

df1:
账户名称单位总经理
1.塞哈尔12
2.莫哈塔10 15

另一个数据帧为:

df2:
输入字段转换
1.帐户名帐户名
2.通用汽车毛利率
3.收入
4.BU业务部门

我想将df1的列重命名为df2中的TRANSL值,如果这些值出现在输入_字段中

我试过:
df1.columns=df1.columns.map(df2.set\u index('INPUT\u FIELD')['TRANSL'].get)

它将列重命名为: [“账户名称”,无,“毛利率”]

我希望有选择地重命名列,而不使用equal运算符,因为此表将来可能会增长。

您可以使用方法转换序列
df2[“TRANSL”]
到字典
映射
,然后您可以使用方法通过将
映射
dict传递到
重命名
方法的
参数来重命名
df1
的列

使用:

这张照片是:

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

您可以轻松地从
df2.值构建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多行且列名位于第一行时,它才会更快,因为这样它不会扫描整个值数组。

要重命名列,可以在键值对字典中传递
df.rename(columns={'Transl':'Units'})
创建字典会增加延迟,我想即时完成,有没有比这更优化的方法?创建字典会增加延迟,我想即时完成,有没有比这更优化的方法?
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)