'DataFrameGroupBy' 对象没有属性 'set_index'
'DataFrameGroupBy' object has no attribute 'set_index'
我有一个数据帧数据。分组并重置索引后,我无法将日期列设置为索引。
data = data.groupby('Payment Date ')
data['Payment Amount '].sum().reset_index()
This is my output resetting index
data = data.set_index('Payment Date ', inplace = True)
data.index
错误:
AttributeError Traceback (most recent call last)
<ipython-input-12-581b0b0bf83f> in <module>
----> 1 data = data.set_index('Payment Date ', inplace = True)
2 data.index
c:\users\nitro\appdata\local\programs\python\python37-32\lib\site-packages\pandas\core\groupby\groupby.py in __getattr__(self, attr)
702
703 raise AttributeError(
--> 704 f"'{type(self).__name__}' object has no attribute '{attr}'"
705 )
706
AttributeError: 'DataFrameGroupBy' object has no attribute 'set_index'
我想我明白了你想做的和你不明白的(主要是关于pandas修改对象的方法)。我假设你想:
- 在
data
中按付款日期计算您的汇总
- 然后将其索引设置为'Payment date'字段
简答:如果你想把这个结果变成data
,只需执行:
data = data.groupby('Payment date ')['Payment amount'].sum().to_frame()
'Payment date ' 将成为您的新索引,to_frame
防止您的单列结果数据框被压缩到 pandas Series
(我认为这是您的初衷为避免,请重置您的索引,然后将其重新设置。
让我们深入研究您的代码。
第一行
data = data.groupby('Payment Date ')
第一行没问题,但可能不完全符合您的要求。你正在使用 data
,我假设它是一个 pandas DataFrame
并重新影响它一个 pandas DataFrameGroupBy
对象。这种对象不包含任何数据,您可以将其简单地视为原始 DataFrame
的索引和关联组(此处为付款日期)之间的映射。
无论如何,您已经将 groupby 对象放入 data
。
第二行
data['Payment Amount '].sum().reset_index()
这一行什么都不做。它在您的 Jupyter notebook 中显示了计算结果,但在 data
中没有任何更改。 data
仍然是同一个 DataFrameGroupBy
对象。
第三行
data = data.set_index('Payment Date ', inplace = True)
抛出异常,表示DataFrameGroupBy
对象没有set_index
方法。这是因为 data
没有被你的第二行代码改变。
即便如此,我还是鼓励您在代码中随时 避免 使用 inplace=True
。您应该始终使用 显式 重新分配。
您的代码可能如下所示(如果您不喜欢上面的简短回答):
data = data.groupby('Payment date ')
data = data['Payment amount'].sum().reset_index()
data = data.set_index('Payment date ') # No inplace=True!
我有一个数据帧数据。分组并重置索引后,我无法将日期列设置为索引。
data = data.groupby('Payment Date ')
data['Payment Amount '].sum().reset_index()
This is my output resetting index
data = data.set_index('Payment Date ', inplace = True)
data.index
错误:
AttributeError Traceback (most recent call last)
<ipython-input-12-581b0b0bf83f> in <module>
----> 1 data = data.set_index('Payment Date ', inplace = True)
2 data.index
c:\users\nitro\appdata\local\programs\python\python37-32\lib\site-packages\pandas\core\groupby\groupby.py in __getattr__(self, attr)
702
703 raise AttributeError(
--> 704 f"'{type(self).__name__}' object has no attribute '{attr}'"
705 )
706
AttributeError: 'DataFrameGroupBy' object has no attribute 'set_index'
我想我明白了你想做的和你不明白的(主要是关于pandas修改对象的方法)。我假设你想:
- 在
data
中按付款日期计算您的汇总
- 然后将其索引设置为'Payment date'字段
简答:如果你想把这个结果变成data
,只需执行:
data = data.groupby('Payment date ')['Payment amount'].sum().to_frame()
'Payment date ' 将成为您的新索引,to_frame
防止您的单列结果数据框被压缩到 pandas Series
(我认为这是您的初衷为避免,请重置您的索引,然后将其重新设置。
让我们深入研究您的代码。
第一行
data = data.groupby('Payment Date ')
第一行没问题,但可能不完全符合您的要求。你正在使用 data
,我假设它是一个 pandas DataFrame
并重新影响它一个 pandas DataFrameGroupBy
对象。这种对象不包含任何数据,您可以将其简单地视为原始 DataFrame
的索引和关联组(此处为付款日期)之间的映射。
无论如何,您已经将 groupby 对象放入 data
。
第二行
data['Payment Amount '].sum().reset_index()
这一行什么都不做。它在您的 Jupyter notebook 中显示了计算结果,但在 data
中没有任何更改。 data
仍然是同一个 DataFrameGroupBy
对象。
第三行
data = data.set_index('Payment Date ', inplace = True)
抛出异常,表示DataFrameGroupBy
对象没有set_index
方法。这是因为 data
没有被你的第二行代码改变。
即便如此,我还是鼓励您在代码中随时 避免 使用 inplace=True
。您应该始终使用 显式 重新分配。
您的代码可能如下所示(如果您不喜欢上面的简短回答):
data = data.groupby('Payment date ')
data = data['Payment amount'].sum().reset_index()
data = data.set_index('Payment date ') # No inplace=True!