【问题标题】:how can I replace NaN value with data from another dataframe in python?如何用 python 中另一个数据框的数据替换 NaN 值?
【发布时间】:2021-11-06 04:09:06
【问题描述】:
from io import StringIO
import pandas as pd

x1 = """No.,col1,col2,col3,A
123,2,5,2,NaN
453,4,3,1,3
146,7,9,4,2
175,2,4,3,NaN
643,0,0,0,2
"""
x2 = """No.,col1,col2,col3,A
123,24,57,22,1
453,41,39,15,2
175,21,43,37,3
"""
df1 = pd.read_csv(StringIO(x1), sep=",")
df2 = pd.read_csv(StringIO(x2), sep=",")

如何用df2中对应的No.列填充df1中的NaN值,以拥有

No. col1 col2 col3 A
123 2 5 2 1
453 4 3 1 3
146 7 9 4 2
175 2 4 3 3
643 0 0 0 2

我尝试了以下行,但没有任何改变

df1['A'].fillna(df2['A'])

【问题讨论】:

    标签: python pandas replace nan


    【解决方案1】:

    使用专门为此目的设计的combine_first

    (df1.set_index('No.')
        .combine_first(df2.set_index('No.'))
        .reset_index()
    )
    

    输出:

       No.  col1  col2  col3    A
    0  123   2.0   5.0   2.0  1.0
    1  146   7.0   9.0   4.0  2.0
    2  175   2.0   4.0   3.0  3.0
    3  453   4.0   3.0   1.0  3.0
    4  643   0.0   0.0   0.0  2.0
    

    fillna 设置“否”后作为索引:

    (df1.set_index('No.')
        .fillna(df2.set_index('No.'))
        .reset_index()
    )
    

    输出:

       No.  col1  col2  col3    A
    0  123     2     5     2  1.0
    1  453     4     3     1  3.0
    2  146     7     9     4  2.0
    3  175     2     4     3  3.0
    4  643     0     0     0  2.0
    )
    

    【讨论】:

    • 这不会弄乱行的顺序吗?
    • 它在reset_index 期间重新排序,如果索引很重要,您可以先将其重置为列
    • df1.combine_first(df1[['No.']].merge(df2, on='No.', how='left'))
    • 这不会用fillna重新排序,所以重新排序实际上是用combine_first进行的
    • 整洁!来自我的 +1 :)
    【解决方案2】:

    fillnamap 的另一种方式:

    df1["A"] = df1["A"].fillna(df1["No."].map(df2.set_index("No.")["A"]))
    
    >>> df1
       No.  col1  col2  col3    A
    0  123     2     5     2  1.0
    1  453     4     3     1  3.0
    2  146     7     9     4  2.0
    3  175     2     4     3  3.0
    4  643     0     0     0  2.0
    

    【讨论】:

      【解决方案3】:

      试试这个:

      df1['A'] = df1['A'].fillna(df2.set_index('No.').reindex(df1['No.'])['A'].reset_index(drop=True))
      

      【讨论】:

        猜你喜欢
        • 2017-12-03
        • 2021-06-29
        • 2022-01-23
        • 2022-01-01
        • 1970-01-01
        • 2015-06-20
        • 1970-01-01
        • 2019-03-23
        • 1970-01-01
        相关资源
        最近更新 更多