读取数据帧,当存在零时,在另一个数据帧中找到相同的列名和行名并填充

时间:2017-04-15 08:04:37

标签: python pandas dataframe

您好我有2个大型pandas数据帧,df和df1。

df是这样的,其值为0。

df:
            Amazon  Apple   Blackberry  Yahoo   Google
    1/1/2000    0   13         0          42    0
    1/1/2001    0   41         0          53    0
    1/1/2002    34  42         0          64    0
    1/1/2003    45  63         0          74    0
    1/1/2004    43  74        24          75    0
    1/1/2005    0   89        25          86    25

现在我有df1,它也有一些相互的列名和行索引。例如:

df1:
              Amazon    Apple   Blackberry  Yahoo   Google
    1/1/2000    0          0       0          53       53
    1/1/2001    24         0       53         53       42
    1/1/2002    42        31       53         53       74
    1/1/2003    52        43      53           0        89
    1/1/2004    52        53       0           0        99
    1/1/2005    24        53       0           0       100

现在我想使用df,并维护df中的所有值。但是当df中有0时,我想查找df1并将df1的值填充到df中,因为列名和索引日期是相同的。

例如,输出将是这样的:

dfoutput
              Amazon    Apple   Blackberry  Yahoo   Google
    1/1/2000    0         13    0             42    53
    1/1/2001    24        41    53            53    42
    1/1/2002    34        42    53            64    74
    1/1/2003    45        63    53            74    89
    1/1/2004    43        74    24            75    99
    1/1/2005    24        89    25            86    25

如果df1中的df不匹配,则df中的值保持为0。实际上,df和df1在较大的数据集中确实略有不同。

感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用combine_first或(fillna)将add替换为0

NaN
df2 = df.replace(0,np.nan).combine_first(df1.replace(0,np.nan))
#alternatively
#df2 = df.replace(0,np.nan).fillna(df1.replace(0,np.nan))
print (df2)
          Amazon  Apple  Blackberry  Yahoo  Google
1/1/2000     NaN     13         NaN     42    53.0
1/1/2001    24.0     41        53.0     53    42.0
1/1/2002    34.0     42        53.0     64    74.0
1/1/2003    45.0     63        53.0     74    89.0
1/1/2004    43.0     74        24.0     75    99.0
1/1/2005    24.0     89        25.0     86    25.0

最后将df2 = df.mask(df==0).combine_first(df1.mask(df1==0)) #alternatively #df2 = df.mask(df==0).fillna(df1.mask(df1==0)) print (df2) Amazon Apple Blackberry Yahoo Google 1/1/2000 NaN 13 NaN 42 53.0 1/1/2001 24.0 41 53.0 53 42.0 1/1/2002 34.0 42 53.0 64 74.0 1/1/2003 45.0 63 53.0 74 89.0 1/1/2004 43.0 74 24.0 75 99.0 1/1/2005 24.0 89 25.0 86 25.0 替换为NaN并转换为0

int