python - 通过带有 MultiIndex 的 .at 从 pd.DataFrame 选择显式单元格

标签 python pandas dataframe multi-index

我有一个基于 MultiIndex 的 pd.DataFrame:

import pandas as pd
data = pd.DataFrame([[2, 3], [4, 5], [6, 7], [8, 9], [10, 11], [12, 13]], index=pd.MultiIndex.from_tuples([
            (pd.Timestamp('2019-07-01 23:00:00'), pd.Timestamp('2019-07-01 23:00:00'), 0),
            (pd.Timestamp('2019-07-02 00:00:00'), pd.Timestamp('2019-07-02 00:00:00'), 0),
            (pd.Timestamp('2019-07-02 00:00:00'), pd.Timestamp('2019-07-02 00:00:00'), 0),
            (pd.Timestamp('2019-07-02 01:00:00'), pd.Timestamp('2019-07-02 01:00:00'), 0),
            (pd.Timestamp('2019-07-02 02:00:00'), pd.Timestamp('2019-07-02 02:00:00'), 0),
            (pd.Timestamp('2019-07-02 03:00:00'), pd.Timestamp('2019-07-02 03:00:00'), 0)],
           names=['dt_calc', 'dt_fore', 'positional_index']), columns=['temp', 'temp_2'])

现在我想用列表对象替换单元格(之前将 DataFrame 类型转换为对象):

idx = data.index[0]
data.at[idx, 'temp'] = [1,2,3]

这将产生:

ValueError                                Traceback (most recent call last)
/app/generic_model/modules/feature_engineering/lstm_pre_processing.py in <module>
----> 1 data.at[idx, 'temp']

/usr/local/lib/python3.8/dist-packages/pandas/core/indexing.py in __getitem__(self, key)
   2151             # GH#33041 fall back to .loc
   2152             if not isinstance(key, tuple) or not all(is_scalar(x) for x in key):
-> 2153                 raise ValueError("Invalid call for scalar access (getting)!")
   2154             return self.obj.loc[key]
   2155 

ValueError: Invalid call for scalar access (getting)!

我不知道问题是什么,因为使用 .loc 工作正常。但是使用 .loc 我无法替换单元格值。在这种情况下,错误消息并没有多大帮助。

我正在 python 3.8 上运行 pd.__version__: 1.2.2

最佳答案

我们仍然可以使用 loc 来分配单个单元格值,方法是创建与需要更新的单元格对应的具有相同索引的中间序列。附带说明一下,将复杂对象存储在 pandas 列中通常不是一个好的做法,因为您将失去矢量化的好处。

data.loc[idx, 'temp'] = pd.Series([[1, 2, 3]], index=[idx])

                                                               temp  temp_2
dt_calc             dt_fore             positional_index                   
2019-07-01 23:00:00 2019-07-01 23:00:00 0                 [1, 2, 3]       3
2019-07-02 00:00:00 2019-07-02 00:00:00 0                         4       5
                                        0                         6       7
2019-07-02 01:00:00 2019-07-02 01:00:00 0                         8       9
2019-07-02 02:00:00 2019-07-02 02:00:00 0                        10      11
2019-07-02 03:00:00 2019-07-02 03:00:00 0                        12      13

关于python - 通过带有 MultiIndex 的 .at 从 pd.DataFrame 选择显式单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68790081/

相关文章:

python - 如何使用 Python/Pandas 将数据框的其他行合并到当前行

python - 根据多列聚合函数的条件结果计算唯一记录

python - Minimax:如何用 Python 实现它?

python - 如何通过BioPython自动将PMC全文保存到磁盘?

python - 从 html 表中获取数据并将其发送到 Pyramid 中的 View

python - Pandas 结合城市和州字符串

python - 下载数据并附加到不同的数据框

javascript - Django:Jquery 单击功能在 Ajax 中不起作用

pandas - 尝试在我的笔记本中查看决策树

r - 使用 R 的应用函数之一简化代码