【问题标题】:NaNs in Pandas dataframe after columnwise operations with multi-index在具有多索引的列操作后 Pandas 数据框中的 NaN
【发布时间】:2020-08-04 04:59:26
【问题描述】:

我正在寻求一些帮助来理解以下结果。为什么我得到 df.loc[1, 'c2'] 的 NaN?由于只有一个索引时我没有得到相同类型的错误,因此它必须与在计算中未指定多索引的第二级有关,但我无法找出确切的问题.为什么它只在我使用 .values 时才有效?

df = pd.DataFrame({'i': [1,1,2,2], 'i2':[1,2,1,2], 'a':[10,20,30,40], 'b':[100,100,300,400]})

df = df.set_index('i')

df.loc[1, 'c1'] = df.loc[1, 'a'] / df.loc[1, 'b']                #Works

df = df.reset_index()
df = df.set_index(['i', 'i2'])

df.loc[1, 'c2'] = df.loc[1, 'a'] / df.loc[1, 'b']                #Fails (NaN)

df.loc[1, 'c2'].index.equals(df.loc[1, 'a'].index)               #True
df.loc[1, 'c2'].index.equals(df.loc[1, 'b'].index)               #True

df.loc[1, 'c3'] = df.loc[1, 'a'].values / df.loc[1, 'b'].values  #Works
df.loc[1, 'c4'] = (df.loc[1, 'a'] / df.loc[1, 'b']).values       #Works

【问题讨论】:

  • 这能回答你的问题吗? Select rows in pandas MultiIndex DataFrame
  • 我不这么认为,除非我只是错过了关键细节。看看那里,我的做法似乎应该可行,尽管答案都是关于选择而不是分配我的问题所在。
  • 我的错误,我更理解你的问题。因为它适用于.values 我会说问题是索引对齐,即使您检查索引是否相等。例如,如果您为第二级选择 slice(None),它似乎可以工作df.loc[(1,slice(None)), 'c5'] = df.loc[(1,slice(None)), 'a'] / df.loc[(1,slice(None)), 'b']

标签: python pandas dataframe indexing nan


【解决方案1】:

我对 pandas 的索引内部结构不够熟悉,无法说明它为什么会这样工作。我可以确认我看到了相同的行为。

这只是一种预感,但也许是使用标量 1 作为索引值有点模棱两可。使用范围/切片似乎可以解决问题,所以也许它可以帮助 pandas 解决一些歧义?同样,这只是一种预感。

df.loc[1:1, 'c1'] = df.loc[1:1, 'a'] / df.loc[1:1, 'b']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-11
    • 2020-02-22
    • 2020-12-17
    • 2012-12-10
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    相关资源
    最近更新 更多