如果所有值都等于np.NaN,如何替换整个Pandas DataFrame行

时间:2017-03-30 14:24:27

标签: python python-3.x pandas nan

示例代码&输出:

data_country1 = {'Country': [np.NaN, 'India', 'Brazil'],
                 'Capital': [np.NaN, 'New Delhi', 'Brasília'],
                 'Population': [np.NaN, 1303171035, 207847528]} 

df_country1 = pd.DataFrame(data_country1, columns=['Country', 'Capital', 'Population'])

data_country2= {'Country': ['Belgium', 'India', 'Brazil'],
                'Capital': ['Brussels', 'New Delhi', 'Brasília'],
                'Population': [102283932, 1303171035, 207847528]} 

df_country2 = pd.DataFrame(data_country2, columns=['Country', 'Capital', 'Population'])

print(df_country1)
print(df_country2)

  Country    Capital    Population
0     NaN        NaN           NaN
1   India  New Delhi  1.303171e+09
2  Brazil   Brasília  2.078475e+08

   Country    Capital  Population
0  Belgium   Brussels   102283932
1    India  New Delhi  1303171035
2   Brazil   Brasília   207847528

在第一个DataFrame中,对于由 ALL NaN组成的每个行,我想用另一个数据帧中的一行替换整行。在此示例中,来自第二个数据帧的行0,以便第一个df以与第二个数据帧相同的信息结束。

3 个答案:

答案 0 :(得分:2)

您可以找到所有元素都有NaN的行,并使用以下内容将其替换为其他数据框的行:

# find the indices that are all NaN
na_indices = df_country1.index[df_country1.isnull().all(axis=1)]

# replace those indices with the values of the other dataframe
df_country1.loc[na_indices,:] = df_country2.loc[na_indices,:]

这假设数据框的形状相同,并且您希望在缺失的行上匹配。

答案 1 :(得分:0)

我将加入两个数据帧:

data_complete=pd.merge(df_country1.dropna(),df_country2,on=['Country','Capital','Population'],how='outer')

答案 2 :(得分:0)

您可以使用append组合它们,删除任何重复项(两个数据框中的行),然后删除值为NaN的所有索引:

#combine into one data frame with unique values
df_country = df_country1.append(df_country2,ignore_index=True).drop_duplicates()

#filter out NaN rows
df_country = df_country.drop(df_country.index[df_country.isnull().all(axis=1)])

append中的ignore_index标志为每一行提供唯一索引,以便当您搜索具有NaN行的索引并返回0时,您不会从df_country2中删除0索引行。