用 pandas 在一列中减去每两行
substract each two row in one column with pandas
我在 google colab 上执行下面的代码时发现了这个问题,它工作正常
df['temps'] = df['temps'].view(int).div(1e9).diff().fillna(0).abs()
print(df)
但是在本地使用 jupyter notebook 时出现以下错误
ValueError Traceback (most recent call last)
Input In [13], in <cell line: 1>()
----> 1 df3['rebounds'] = pd.Series(df3['temps'].view(int).div(1e9).diff().fillna(0))
File C:\Python310\lib\site-packages\pandas\core\series.py:818, in Series.view(self, dtype)
815 # self.array instead of self._values so we piggyback on PandasArray
816 # implementation
817 res_values = self.array.view(dtype)
--> 818 res_ser = self._constructor(res_values, index=self.index)
819 return res_ser.__finalize__(self, method="view")
File C:\Python310\lib\site-packages\pandas\core\series.py:442, in Series.__init__(self, data, index, dtype, name, copy, fastpath)
440 index = default_index(len(data))
441 elif is_list_like(data):
--> 442 com.require_length_match(data, index)
444 # create/copy the manager
445 if isinstance(data, (SingleBlockManager, SingleArrayManager)):
File C:\Python310\lib\site-packages\pandas\core\common.py:557, in require_length_match(data, index)
553 """
554 Check the length of data matches the length of the index.
555 """
556 if len(data) != len(index):
--> 557 raise ValueError(
558 "Length of values "
559 f"({len(data)}) "
560 "does not match length of index "
561 f"({len(index)})"
562 )
ValueError: Length of values (830) does not match length of index (415)
任何解决此问题的建议!!
这里有两种方法可以让它发挥作用:
df3['rebounds'] = pd.Series(df3['temps'].view('int64').diff().fillna(0).div(1e9))
... 或:
df3['rebounds'] = pd.Series(df3['temps'].astype('int64').diff().fillna(0).div(1e9))
对于以下示例输入:
df3.dtypes:
temps datetime64[ns]
dtype: object
df3:
temps
0 2022-01-01
1 2022-01-02
2 2022-01-03
...以上两个代码示例都给出了以下输出:
df3.dtypes:
temps datetime64[ns]
rebounds float64
dtype: object
df3:
temps rebounds
0 2022-01-01 0.0
1 2022-01-02 86400.0
2 2022-01-03 86400.0
问题可能是 view()
本质上将现有系列的原始数据重新解释为不同的数据类型。为此,根据 Series.view()
docs (see also the numpy.ndarray.view()
docs) 数据类型必须具有相同的字节数。由于原始数据是 datetime64
,您的代码将 int
指定为 view() 的参数可能不满足此要求。明确指定 int64
应该满足它。或者,使用 astype()
而不是 view()
和 int64 也可以。
至于为什么这适用于 colab 而不是 jupyter notebook,我不能说。也许他们使用不同版本的 pandas 和 numpy,它们对 int
的处理方式不同。
我确实知道在我的环境中,如果我尝试以下操作:
df3['rebounds'] = pd.Series(df3['temps'].astype('int').diff().fillna(0).div(1e9))
...然后我得到这个错误:
TypeError: cannot astype a datetimelike from [datetime64[ns]] to [int32]
这表明 int
意味着 int32
。看看这是否适用于 colab 会很有趣。
我在 google colab 上执行下面的代码时发现了这个问题,它工作正常
df['temps'] = df['temps'].view(int).div(1e9).diff().fillna(0).abs()
print(df)
但是在本地使用 jupyter notebook 时出现以下错误
ValueError Traceback (most recent call last)
Input In [13], in <cell line: 1>()
----> 1 df3['rebounds'] = pd.Series(df3['temps'].view(int).div(1e9).diff().fillna(0))
File C:\Python310\lib\site-packages\pandas\core\series.py:818, in Series.view(self, dtype)
815 # self.array instead of self._values so we piggyback on PandasArray
816 # implementation
817 res_values = self.array.view(dtype)
--> 818 res_ser = self._constructor(res_values, index=self.index)
819 return res_ser.__finalize__(self, method="view")
File C:\Python310\lib\site-packages\pandas\core\series.py:442, in Series.__init__(self, data, index, dtype, name, copy, fastpath)
440 index = default_index(len(data))
441 elif is_list_like(data):
--> 442 com.require_length_match(data, index)
444 # create/copy the manager
445 if isinstance(data, (SingleBlockManager, SingleArrayManager)):
File C:\Python310\lib\site-packages\pandas\core\common.py:557, in require_length_match(data, index)
553 """
554 Check the length of data matches the length of the index.
555 """
556 if len(data) != len(index):
--> 557 raise ValueError(
558 "Length of values "
559 f"({len(data)}) "
560 "does not match length of index "
561 f"({len(index)})"
562 )
ValueError: Length of values (830) does not match length of index (415)
任何解决此问题的建议!!
这里有两种方法可以让它发挥作用:
df3['rebounds'] = pd.Series(df3['temps'].view('int64').diff().fillna(0).div(1e9))
... 或:
df3['rebounds'] = pd.Series(df3['temps'].astype('int64').diff().fillna(0).div(1e9))
对于以下示例输入:
df3.dtypes:
temps datetime64[ns]
dtype: object
df3:
temps
0 2022-01-01
1 2022-01-02
2 2022-01-03
...以上两个代码示例都给出了以下输出:
df3.dtypes:
temps datetime64[ns]
rebounds float64
dtype: object
df3:
temps rebounds
0 2022-01-01 0.0
1 2022-01-02 86400.0
2 2022-01-03 86400.0
问题可能是 view()
本质上将现有系列的原始数据重新解释为不同的数据类型。为此,根据 Series.view()
docs (see also the numpy.ndarray.view()
docs) 数据类型必须具有相同的字节数。由于原始数据是 datetime64
,您的代码将 int
指定为 view() 的参数可能不满足此要求。明确指定 int64
应该满足它。或者,使用 astype()
而不是 view()
和 int64 也可以。
至于为什么这适用于 colab 而不是 jupyter notebook,我不能说。也许他们使用不同版本的 pandas 和 numpy,它们对 int
的处理方式不同。
我确实知道在我的环境中,如果我尝试以下操作:
df3['rebounds'] = pd.Series(df3['temps'].astype('int').diff().fillna(0).div(1e9))
...然后我得到这个错误:
TypeError: cannot astype a datetimelike from [datetime64[ns]] to [int32]
这表明 int
意味着 int32
。看看这是否适用于 colab 会很有趣。