python - pandas 1.1.5 和 1.3.4 之间的哪些变化改变了 set_index / reset_index 过程?
问题描述
在我们团队中有人将 pandas 从 1.1.5 升级到 1.3.4 之前,我们的一些代码运行良好。这是导致问题的代码的简化版本。理想情况下,我想知道如何更改 set_index 和/或 reset_index 调用,以便它们可以在 1.1.5 和 1.3.4 下工作。
熊猫 1.1.5:
>>> import pandas
>>> from pandas import Timestamp
>>> df = pandas.DataFrame({'label': {1000: 'apple',
1001: 'carrot',
1002: 'carrot',
1003: 'apple',
1004: 'apple',
1005: 'carrot'},
'date': {1000: Timestamp('2021-10-27 00:00:00'),
1001: Timestamp('2021-10-27 00:00:00'),
1002: Timestamp('2021-10-28 00:00:00'),
1003: Timestamp('2021-10-28 00:00:00'),
1004: Timestamp('2021-10-29 00:00:00'),
1005: Timestamp('2021-10-29 00:00:00')},
'stock': {1000: 100,
1001: 150,
1002: 75,
1003: 50,
1004: 200,
1005: 20}})
>>> df_rolling = df.set_index(['label', 'date']).groupby(level='label').rolling(window=7, min_periods=1).sum()
>>> df_rolling
stock
label
apple 100.0
apple 150.0
apple 350.0
carrot 150.0
carrot 225.0
carrot 245.0
>>> df_rolling.index
MultiIndex([( 'apple',),
( 'apple',),
( 'apple',),
('carrot',),
('carrot',),
('carrot',)],
names=['label'])
>>> df_rolling = df_rolling.reset_index()
>>> df_rolling.index
RangeIndex(start=0, stop=6, step=1)
熊猫 1.3.4:
>>> import pandas
>>> from pandas import Timestamp
>>> df = pandas.DataFrame({'label': {1000: 'apple',
1001: 'carrot',
1002: 'carrot',
1003: 'apple',
1004: 'apple',
1005: 'carrot'},
'date': {1000: Timestamp('2021-10-27 00:00:00'),
1001: Timestamp('2021-10-27 00:00:00'),
1002: Timestamp('2021-10-28 00:00:00'),
1003: Timestamp('2021-10-28 00:00:00'),
1004: Timestamp('2021-10-29 00:00:00'),
1005: Timestamp('2021-10-29 00:00:00')},
'stock': {1000: 100,
1001: 150,
1002: 75,
1003: 50,
1004: 200,
1005: 20}})
>>> df_rolling = df.set_index(['label', 'date']).groupby(level='label').rolling(window=7, min_periods=1).sum()
>>> df_rolling
stock
label label date
apple apple 2021-10-27 100.0
2021-10-28 150.0
2021-10-29 350.0
carrot carrot 2021-10-27 150.0
2021-10-28 225.0
2021-10-29 245.0
>>> df_rolling.index
MultiIndex([( 'apple', 'apple', '2021-10-27'),
( 'apple', 'apple', '2021-10-28'),
( 'apple', 'apple', '2021-10-29'),
('carrot', 'carrot', '2021-10-27'),
('carrot', 'carrot', '2021-10-28'),
('carrot', 'carrot', '2021-10-29')],
names=['label', 'label', 'date'])
>>> df_rolling = df_rolling.reset_index()
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-53-8b81c1e32ea2> in <module>
----> 1 df_rolling = df_rolling.reset_index()
/usr/local/lib/python3.8/dist-packages/pandas/util/_decorators.py in wrapper(*args, **kwargs)
309 stacklevel=stacklevel,
310 )
--> 311 return func(*args, **kwargs)
312
313 return wrapper
/usr/local/lib/python3.8/dist-packages/pandas/core/frame.py in reset_index(self, level, drop, inplace, col_level, col_fill)
5797 )
5798
-> 5799 new_obj.insert(0, name, level_values)
5800
5801 new_obj.index = new_index
/usr/local/lib/python3.8/dist-packages/pandas/core/frame.py in insert(self, loc, column, value, allow_duplicates)
4412 if not allow_duplicates and column in self.columns:
4413 # Should this be a different kind of error??
-> 4414 raise ValueError(f"cannot insert {column}, already exists")
4415 if not isinstance(loc, int):
4416 raise TypeError("loc must be int")
ValueError: cannot insert label, already exists
解决方案
不确定它是否能解决您的问题,因为我无法在两个版本上都对其进行测试,但是,请尝试使用inplace=True
以下参数:
df_rolling.reset_index(inplace=True)
这样做,您不需要将整个 DF 重新分配回同一个变量。
Python 中的一个主要问题是等号=
不仅从右到左赋值,而且从左到右赋值,因此,如果你写
a = b
它的字面意思是 A 获得 B 值并且 B 获得 A 值。因此,回到您的问题,当您尝试将 DF 的“重置索引 DF”版本分配给 original_indexed BF 时,编译器可能会抛出异常,并且同时反过来。
另一种选择可能是使用带有.copy()
method 的临时 DF,如下所示:
myDF = pd.DataFrame(blabla...)
tempDF = myDF.reset_index()
myDF = tempDF.copy()
如果它们都有效,我更喜欢“就地”解决方案。试一试并报告结果。
推荐阅读
- regex - Ansible - 在 CentOS 6 中删除登录窗口
- php - 试图获取非对象的属性“deskripsi”(查看:
- nginx - Nginx RTMP 与 Flask
- html - 如何使覆盖元素响应
- rust - 无法移出递归结构的共享引用
- scikit-learn - scikit learn error - 100. * self.contamination) TypeError: unsupported operand type(s) for *: 'float' and 'type'
- powerbi - 在 Power BI 中按年份创建度量(百分比)
- android - Android Studio 4.0 似乎将随机垃圾插入到布局文件中
- sql - 如何在laravel中对三个不同表中的三个列求和
- google-cloud-platform - Bigquery 中数组元素的总和