主要编辑:
显然我的问题很难理解,所以我会尽力具体化。
我有两个数据框,“df1”和“df2”。它们相当大,比下面的代码块大,所以我想自动化重命名过程以使名称匿名。
第一个 df1 在其索引中包含的名称如下:
Yearly energy consumption Size rating
Almtunaskolan 322149.324250 Medium school
Almunge skola 383479.065917 Medium school
Bergaskolan (Videskolan) 296916.405000 Medium school
Danmarks skola 84884.857333 Small school
Domarringens skola 463568.627250 Large school
Ekuddens skola 177668.365000 Small school
在此数据框中,每个用户名(位于索引中)在第二列“大小评级”中都有一个大小评级。我想使用此评级来重命名 another 数据帧 df2 中的用户名。
另一个 df2 的名称较少,因为与 df1 中的索引相比,有些名称已被过滤掉。但是df2中的所有列名都存在于df1中的索引名称中。不同之处在于,这里的用户名位于列中,如下所示 df2:
datetime Almtunaskolan Almunge skola ... Real user name ... Real user name ... \
24 2017-01-02 00:00:00 0.001268 0.000579
25 2017-01-02 01:00:00 0.001257 0.000591
26 2017-01-02 02:00:00 0.001257 0.000583
27 2017-01-02 03:00:00 0.001257 0.000587
28 2017-01-02 04:00:00 0.001268 0.000583
现在的问题是:如何使用 df1 中的“大小评级”为每个用户重命名 df2 中的列?
例如,在 df1 中,第一行有“Almtunaskolan”,这也是 df2 中第一列的用户。所以我想将 df2 中第一列中的“Almtunaskolan”重命名为“Medium school”等
也就是说,我想让它看起来像这样:
datetime Medium school Medium school ... Small school ... Large school... \
24 2017-01-02 00:00:00 0.001268 0.000579
25 2017-01-02 01:00:00 0.001257 0.000591
26 2017-01-02 02:00:00 0.001257 0.000583
27 2017-01-02 03:00:00 0.001257 0.000587
28 2017-01-02 04:00:00 0.001268 0.000583
请注意,df2 中的用户较少,即 df2 中的列数少于 df1 中的索引数。
我怎样才能实现这个目标:x 我距离 Pandas 的专业人士还很远,但是像这样的事情甚至很难开始......
我尝试了不同的 df.renaming 选项,或使用 fidning df2.columns == df1.index 的 for 循环,以及一些字典或映射,但我无法使它们工作
您可以从 df1 生成一个字典,然后使用它来使用
map()
更改 df2 中的列名称,如下面的简化示例所示:
import pandas as pd
df1= pd.DataFrame({'x': ['a','b'],
'y': [1, 2],
'z': ['name1', 'name2']
})
df1 = df1.set_index('x')
df2 = pd.DataFrame({'a': [1, 2, 3],
'b': [3, 4, 5]
})
print(df1,'\n')
print(df2,'\n')
change = df1['z'].to_dict()
df2.columns = df2.columns.map(change)
print(df2)
打印
y z
x
a 1 name1
b 2 name2
a b
0 1 3
1 2 4
2 3 5
name1 name2
0 1 3
1 2 4
2 3 5