由其他数据框行填充

Posted

技术标签:

【中文标题】由其他数据框行填充【英文标题】:fillna by other dataframe row 【发布时间】:2017-01-22 08:49:59 【问题描述】:

我有一个问题:

import pandas
df1=pandas.DataFrame([['2017-1-22',25,None],['2017-1-23','',''],['2017-1-24',24,15]],columns=['date','high_tem','low_tem'])
df2=pandas.DataFrame([['2017-1-22',22,18],['2017-1-23',23,''],['2017-1-24',20,10]],columns=['date','high_tem','low_tem'])
df3=pandas.DataFrame([['2017-1-22',25,16],['2017-1-23',24,18],['2017-1-24',22,11]],columns=['date','high_tem','low_tem'])

df1,df2,df3 像这样:

        date high_tem low_tem
0  2017-1-22       25    None
1  2017-1-23                 
2  2017-1-24       24      15
        date  high_tem low_tem
0  2017-1-22        22      18
1  2017-1-23        23        
2  2017-1-24        20      10
        date  high_tem  low_tem
0  2017-1-22        25       16
1  2017-1-23        24       18
2  2017-1-24        22       11

我尝试得到这样的结果:

         date  high_tem  low_tem
0  2017-1-22        22       18
1  2017-1-23        24       18
2  2017-1-24        24       15

None 位于 df1 的第一行(索引 = 0)。所以我使用 df2 第一行(与 df1 第一行具有相同的日期)来替换它。

空字符串在df1第二行(索引=1),df2第二行有空字符串。所以我用df3第二行来代替它。

df1 第三行不包含 None 和 Null 字符串,我不更改此行。

谢谢

【问题讨论】:

值得指定您希望如何循环浏览 DataFrames 以及从哪个 DataFrame 填充 NaN 值的规则。 @oliversm,顺序是df1 df2 df3。如果 df1 行包含无或空字符串,则检查 df2,如果 df2 行包含无或空字符串,则检查 df3。否则无。 所以你只对生成的df1感兴趣? 【参考方案1】:

您可以遍历每个数据帧并将None 和空字符串替换为np.NaN。只要存在任何NaNs,就用它填充整个行。

for df in [df1, df2, df3]:
    df.replace(None: np.NaN, "": np.NaN, inplace=True)
    df.loc[df.isnull().any(axis=1), ['high_tem', 'low_tem']] = np.NaN

在此之后,df1df2df3 将相应修改。

df1→df2→df3 order 中使用DF.combine_first() 来填充缺失值。

df1.combine_first(df2).combine_first(df3)

【讨论】:

以上是关于由其他数据框行填充的主要内容,如果未能解决你的问题,请参考以下文章

从其他数据框行和列位置找到相应的值

如何通过单击列表框行项将搜索结果返回到文本框

如何找到由数据库填充的 MoveTo 目的地?

PL/SQL - 声明带有由其他游标填充的表的游标时出错

laravel的seeder数据填充

核心数据填充的表无法正确显示