python - 为什么使用 Series 设置 MultiIndex 数据框会给出一列 NaN?

标签 python pandas

以下代码说明了我的问题:

In [2]: idx = pd.date_range('1/1/2011', periods=5)

In [3]: idx
Out[3]:
DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'],
    dtype='datetime64[ns]', freq='D')

In [4]: midx = pd.MultiIndex.from_product([['100', '200'], idx])

In [5]: midx
Out[5]: MultiIndex(levels=[['100', '200'],
    [2011-01-01 00:00:00, 2011-01-02 00:00:00, 2011-01-03 00:00:00, 2011-01-04 00:00:00, 2011-01-05 00:00:00]], 
    labels=[[0, 0, 0, 0, 0, 1, 1, 1, 1, 1], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]])

In [6]: test_data = pd.DataFrame(
            2*[[1, 2], [NaN, 3], [4, NaN], [5, 6], [7, 8]],
            index=midx, columns=['quant1', 'quant2']
        )

In [7]: test_data
Out[7]: 
                quant1  quant2
100 2011-01-01     1.0     2.0
    2011-01-02     NaN     3.0
    2011-01-03     4.0     NaN
    2011-01-04     5.0     6.0
    2011-01-05     7.0     8.0
200 2011-01-01     1.0     2.0
    2011-01-02     NaN     3.0
    2011-01-03     4.0     NaN
    2011-01-04     5.0     6.0
    2011-01-05     7.0     8.0

In [8]: new_data = pd.DataFrame([11, 12, 13, 14, 15], index=idx, columns=['quant1'])

In [9]: new_data
Out[9]: 
            quant1
2011-01-01      11
2011-01-02      12
2011-01-03      13
2011-01-04      14
2011-01-05      15

In [10]: test_data.loc['100', 'quant1'] = new_data

In [11]: test_data
Out[11]: 
                quant1  quant2
100 2011-01-01     NaN     2.0
    2011-01-02     NaN     3.0
    2011-01-03     NaN     NaN
    2011-01-04     NaN     6.0
    2011-01-05     NaN     8.0
200 2011-01-01     1.0     2.0
    2011-01-02     NaN     3.0
    2011-01-03     4.0     NaN
    2011-01-04     5.0     6.0
    2011-01-05     7.0     8.0

为什么['100', 'quant1']数据段填充的是NaN而不是new_data中的数字?

我发现使用

test_data.loc['100', 'quant1'] = new_data.values

确实有效,但我想了解是什么让Pandas做到这一点。子切片与新数据具有相同的尺寸,甚至相同的索引,所以即使我确实怀疑这与索引/对齐有关,但我真的不明白如何或为什么 - 我的期望是只要您使用与分配的索引完全相同的索引,就可以正常工作。

最佳答案

因为 Pandas 对齐接收数据帧的索引和提供新数据的系列。当它找到时,它无法找到它正在寻找的相关索引。

test_data.loc['100', 'quant2'] 的索引条目为 ('100', '2011-01-01')new_data 的条目为 '2011-01-01'。这些不一样。

解决方法 1

使用values属性并跳过 Pandas 尝试对齐

test_data.loc['100', 'quant1'] = new_data.values

test_data

                quant1  quant2
100 2011-01-01    11.0     2.0
    2011-01-02    12.0     3.0
    2011-01-03    13.0     NaN
    2011-01-04    14.0     6.0
    2011-01-05    15.0     8.0
200 2011-01-01     1.0     2.0
    2011-01-02     NaN     3.0
    2011-01-03     4.0     NaN
    2011-01-04     5.0     6.0
    2011-01-05     7.0     8.0
<小时/>

解决办法 2

使用pd.concat添加索引级别

test_data.loc['100', 'quant1'] = pd.concat({'100': new_data})

test_data

                quant1  quant2
100 2011-01-01    11.0     2.0
    2011-01-02    12.0     3.0
    2011-01-03    13.0     NaN
    2011-01-04    14.0     6.0
    2011-01-05    15.0     8.0
200 2011-01-01     1.0     2.0
    2011-01-02     NaN     3.0
    2011-01-03     4.0     NaN
    2011-01-04     5.0     6.0
    2011-01-05     7.0     8.0

关于python - 为什么使用 Series 设置 MultiIndex 数据框会给出一列 NaN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52443951/

相关文章:

带 flask 的 Python CGI 不起作用

python - 如何根据其他两个系列及其索引创建 Pandas 系列?

python - 如何修复jupyter笔记本中的 'Key Error: Index'错误

python - 通过分隔符将 Pandas Series 拆分为 DataFrame

python - 如何将嵌套字典与 .map 用于 Pandas 系列? pd.Series([]).map

python - 追加具有相同值的行的值

python - 转换时区 Pandas 数据框

带有 IntEnum 的 pandas value_counts() 引发 RecursionError

Python, Matplotlib, 散点图, 改变点击点的颜色

python - 使用顺序求解器时,如何在 Python Gekko 中定义 Intermediate 的最大值和另一个值?