如果行索引在多索引对象中不存在,则用NaN替换数据框中的某些值

时间:2019-03-31 23:30:05

标签: python pandas dataframe

我有一个非常大的数据框,类似于此:

    Customer_Id   Day    Hour   Latitude   Longitude     
0.        a        dd     hh      x1         y1
1.        a        dd     hh'     x2         y2
2.        a        dd     hh'     x3         y3
3.        b        dd     hh'     x4         y4

然后有一个对象(可以根据需要将其转换为DataFrame),每个对象每天每个小时的经纬度样本。但是,此处的Customer_Id,Day和Hour是所有索引,而之前则不是。看起来像这样:

                                 Latitude   Longitude
Customer_Id    Day     Hour
    a          dd       hh         x1         y1
               dd       hh'        x3         y3
    b          dd       hh'        x4         y4

以前,我有两个数据帧,每个数据帧只有一个索引(让我们将它们称为第一个df1,这里是firt数据帧,第二个称为df2,这是我拥有的单个索引数据帧,而不是第二个对象),所以我用了:

df1['Latitude']= np.where((~df1.index.isin(df2.index)), np.nan, df1['Latitude'])

以前,此代码有效,但现在在此新方案下,它将返回此错误:

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

我试图相应地更改代码,但是它不起作用。有人可以看看吗?

1 个答案:

答案 0 :(得分:1)

您需要使用DataFrame.reset_index重设索引:

df1['Latitude']= np.where((~df1.index.isin(df2.reset_index().index)), np.nan, df1['Latitude'])

print(df1)
  Customer_Id Day Hour Latitude Longitude
0           a  dd   hh       x1        y1
1           a  dd  hh'       x2        y2
2           a  dd  hh'       x3        y3
3           b  dd  hh'      NaN        y4

reset_index有什么作用
它将索引转换回列:

print(df2.reset_index())
  Customer_Id Day Hour Latitude Longitude
0           a  dd   hh       x1        y1
1           a  dd  hh'       x3        y3
2           b  dd  hh'       x4        y4