我有一个数据帧如下:
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
我想将df1的列重命名为df2中的Transl值,前提是这些值存在于INPUT_FIELD中。
我试过了:df1.columns = df1.columns.map(df2.set_index('INPUT_FIELD')['TRANSL'].get)
它将列重命名为:'Account Name',None,'Gross Margin‘
我希望有选择地重命名列,而不使用equal运算符,因为这个表将来可能会增长。
发布于 2020-04-22 16:58:42
可以使用Series.to_dict
方法将一系列df2["TRANSL"]
转换为字典mappings
,然后可以使用DataFrame.rename
方法将df1
的列重命名,方法是将mappings
dict传递给rename
方法的columns
参数。
使用:
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
发布于 2020-04-22 17:11:04
您可以很容易地从df2.values
构建字典理解
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
Rename还接受映射程序函数,因此您可以使用:
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多行并且列名在第一行时,它才会更快,因为这样它就不会扫描整个值数组。
https://stackoverflow.com/questions/61360810
复制相似问题