python - 如何正确使用 pandas Series.map() 和映射字典?

标签 python pandas dataframe dictionary

数据框smaller_df看起来像这样:

> smaller_df.head()
   MSA Code  Line   RPP
0     10180   1.0  91.2
1     10180   2.0  97.4
2     10180   3.0  78.7
3     10180   4.0  93.5
4     10420   1.0  90.4
...

smaller_df.dtypes 结果为

MSA Code      int64
Line        float64
RPP         float64
Wages        object
dtype: object

wage_keys.head() 给出:

   MSA Code  Average Wage
0     11260  94490.000000
1     21820  72080.000000
2     10180  71128.571429
3     13820  87338.396624
4     10420  76620.000000
...

wage_keys.dtypes 是:

MSA Code          int64
Average Wage    float64
dtype: object

请注意,相同的“MSA 代码”可以在smaller_df 中出现多次,但在wage_keys 中只能出现一次。

我希望将smaller_df中的新列“Wages”设置为wage_keys中的相应值。

所以新表应该如下所示:

   MSA Code  Line   RPP Wages
0     10180   1.0  91.2   71128.571429
1     10180   2.0  97.4   71128.571429
2     10180   3.0  78.7   71128.571429
3     10180   4.0  93.5   71128.571429
4     10420   1.0  90.4   76620.000000
...

我有以下代码来通过制作工资字典来进行映射:

wages = wage_keys.set_index('MSA Code').to_dict()
smaller_df['Wages'] = smaller_df['MSA Code'].map(wages)

问题是这会导致:

   MSA Code  Line   RPP Wages
0     10180   1.0  91.2   NaN
1     10180   2.0  97.4   NaN
2     10180   3.0  78.7   NaN
3     10180   4.0  93.5   NaN
4     10420   1.0  90.4   NaN

显然,我错过了一些东西。如何将“工资”列的值设置为工资字典(或工资 key 数据帧)中的正确对应值?

最佳答案

您的错误在于转换为字典。你做到了,

df2.set_index('MSA Code').to_dict()
# {
#     "Average Wage": {
#         "10180": 71128.571429,
#         "10420": 76620.0,
#         "11260": 94490.0,
#         "13820": 87338.396624,
#         "21820": 72080.0
#     }
# }

这会产生一个字典中的字典。你应该做的是,

df2.set_index('MSA Code')['Average Wage'].to_dict()
# {11260: 94490.0, 21820: 72080.0, 10180: 71128.571429, 13820: 87338.396624, 10420: 76620.0}

或者,

df2.set_index('MSA Code')['Average Wage']

MSA Code
11260    94490.000000
21820    72080.000000
10180    71128.571429
13820    87338.396624
10420    76620.000000
Name: Average Wage, dtype: float64

这两者都会产生 map 可以理解的映射格式。现在您的 map 调用会产生预期的输出:

df['Wages'] = df['MSA Code'].map(df2.set_index('MSA Code')['Average Wage'])
df

   MSA Code  Line   RPP         Wages
0     10180   1.0  91.2  71128.571429
1     10180   2.0  97.4  71128.571429
2     10180   3.0  78.7  71128.571429
3     10180   4.0  93.5  71128.571429
4     10420   1.0  90.4  76620.000000

关于python - 如何正确使用 pandas Series.map() 和映射字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56638227/

相关文章:

python - 如何删除特定的网格线?

python - match_phrase 不适用于分析索引

python & pandas - 删除列值是另一个 DataFrame 中的索引值的行

python-3.x - 如何从 pandas 的 excel 文件中排除页眉和页脚

Python:将数据框写入现有的Excel,其中包含带有图像的工作表

python - 如何使用seaborn绘制带有嵌套数据的时间序列箱线图?

python - 如果我使用 % 格式化字符串,PyCharm 应该警告我

python - 根据 Pandas 中的行值划分列

r - 仅当重复值出现在第一个采样周期时才保留它们

python - 在 pandas 数据框中寻找值(value)