【问题标题】:Python: Replacing NaN in a specific column by values from another dataframe after matching values in a different columnPython:在匹配不同列中的值后,用另一个数据框中的值替换特定列中的 NaN
【发布时间】:2020-10-04 01:52:32
【问题描述】:

假设我有 df1:

    series_id       hour       temp       angle
0   001             12         NaN        130
1   001             11         16         149
2   002             12         18.9       128
3   002             13         20         NaN
4   003             13         NaN        NaN
5   003             11         NaN        97
6   003             12         17.3       216

&df2:

    hour      temp
0   11          17
1   12          15
2   13          16

我希望在这里做的是将 df1 中“temp”列中的 NA 值替换为 df2 中的值,其中 df1 中“hour”列的值与 df2 中的值匹配。 df1 的期望结果:

    series_id       hour       temp       angle
0   001             12         15         130
1   001             11         16         149
2   002             12         18.9       128
3   002             13         20         NaN
4   003             13         16         NaN
5   003             11         17         97
6   003             12         17.3       216

我是 Python 新手,不熟悉这种语言的语法。对此有何建议?

额外:相当于我在 R 中想要的内容是

df1$temp <- ifelse(is.na(df1$temp), df2$temp[match(df1$hour, df2$hour)], df1$temp)

这是我用来在 Python 中创建两个数据框的代码:

import pandas as pd
import numpy as np    

df1 = {'series_id' : ['001','001','002','002','003','003','003'],
       'hour' : [12,11,12,13,13,11,12],
       'temp' : [np.nan, 16, 18.9, 20, np.nan, np.nan, 17.3],
       'angle' : [130,149,128, np.nan, np.nan,97,216]}
df2 = {'hour' : [11,12,13],
       'temp' : [17,15,16]}
df1 = pd.DataFrame(df1, columns = ['series_id', 'hour', 'temp', 'angle'])
df2 = pd.DataFrame(df2, columns = ['hour', 'temp'])

【问题讨论】:

    标签: python pandas dataframe match nan


    【解决方案1】:
    df1['temp'] = df1['temp'].fillna(pd.merge(df1, df2, on='hour', how='left')['temp_y'])
    print(df1)
    

    打印:

      series_id  hour  temp  angle
    0       001    12  15.0  130.0
    1       001    11  16.0  149.0
    2       002    12  18.9  128.0
    3       002    13  20.0    NaN
    4       003    13  16.0    NaN
    5       003    11  17.0   97.0
    6       003    12  17.3  216.0
    

    【讨论】:

    • 另一种选择是map df1['temp'].fillna(df1['hour'].map(df2.set_index('hour')['temp'])) ;)
    猜你喜欢
    • 2020-04-14
    • 2020-09-10
    • 2021-06-29
    • 1970-01-01
    • 2019-01-05
    • 2019-03-23
    • 1970-01-01
    • 2021-05-06
    • 2021-01-24
    相关资源
    最近更新 更多