Python Pandas Dataframe 将特定的日期时间行标签设置为索引中的字符串?

Posted

技术标签:

【中文标题】Python Pandas Dataframe 将特定的日期时间行标签设置为索引中的字符串?【英文标题】:Python Pandas Dataframe Set specific datetime row label to string in index? 【发布时间】:2015-09-09 15:27:35 【问题描述】:

我的 Pandas 数据框代码

import pandas as pd
df = pd.DataFrame('Impressions': [92964, 91282, 88143,272389], 'Clicks': [3128, 3131, 2580, 8839], index=pd.to_datetime(['6/1/2015', '6/8/2015', '6/15/2015', '1/1/2020']))
df.index.name = 'Date'

生产

            Clicks  Impressions
Date                           
2015-06-01    3128        92964
2015-06-08    3131        91282
2015-06-15    2580        88143
2020-01-01    8839       272389

如何将2020-01-01 更改为显示Total 的字符串?

我想要实现的是:

            Clicks  Impressions
Date                           
2015-06-01    3128        92964
2015-06-08    3131        91282
2015-06-15    2580        88143
Total         8839       272389

更多上下文 df.index.dtype 的数据类型为 dtype('<M8[ns]') 我想我可以通过这个df.index[-1] 访问索引行标签,它告诉我这是一个Timestamp('2020-01-01 00:00:00')

但是如果我尝试做这样的事情,它就行不通: df.index[-1] = 'Total'

错误:

Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    df.index[-1] = 'Total'
  File "C:\Python34\lib\site-packages\pandas\core\index.py", line 922, in __setitem__
    raise TypeError("Indexes does not support mutable operations")
TypeError: Indexes does not support mutable operations

【问题讨论】:

这个帖子好像有你要找的东西:***.com/questions/19851005/… 感谢您的提示。最终,df.rename(index=df.index[-1]: 'Total') 确实将我在问题中发布的示例数据的索引值更改为Total。但是,当我尝试在我正在开发的主要应用程序中使用它时,它对我不起作用。我认为@bleh 是正确的,问题是在同一个数组中处理多种数据类型。不过还是谢谢。 【参考方案1】:

这是一种方法:

In [154]: %paste
import pandas as pd
df = pd.DataFrame('Impressions': [92964, 91282, 88143,272389], 'Clicks': [3128, 3131, 2580, 8839], index=pd.to_datetime(['6/1/2015', '6/8/2015', '6/15/2015', '1/1/2020']))
df.index.name = 'Date'

## -- End pasted text --

In [155]: df = df.reset_index()

In [156]: df['Date'] = df['Date'].astype(object)

In [157]: df['Date'] = df.Date.dt.date

In [158]: df.ix[3,0] = 'Total'

In [159]: df.index = df.Date

In [160]: df.drop(['Date'], axis=1, inplace=True)

In [161]: df
Out[161]: 
            Clicks  Impressions
Date                           
2015-06-01    3128        92964
2015-06-08    3131        91282
2015-06-15    2580        88143
Total         8839       272389

问题是试图在同一个数组中处理多种数据类型。您需要将系列转换为 object 类型。

【讨论】:

【参考方案2】:

几年后,事后看来,我在处理这个问题时并不知道 Pandas 数据透视表有一个 margins 参数,它可以添加像 "total" 这样的标签并提供总和行。

df.head(3).pivot_table(['Impressions', 'Clicks'], index=df.index[:-1],
                       aggfunc='sum', margins=True, margins_name='Total')

                     Clicks  Impressions
Date                                    
2015-06-01 00:00:00    3128        92964
2015-06-08 00:00:00    3131        91282
2015-06-15 00:00:00    2580        88143
Total                  8839       272389

但要更准确地回答“如何将特定标签分配给某一行的日期时间索引”的问题,您基本上不能,因为整个索引是@987654324的数据类型@ 所以所有元素都需要是这种类型。

要解决这个问题,您可以这样做:

idx = df.index.strftime('%Y-%m-%d')
idx.values[-1] = 'Total'
df.index = idx

结果

            Impressions  Clicks
2015-06-01        92964    3128
2015-06-08        91282    3131
2015-06-15        88143    2580
Total            272389    8839

【讨论】:

以上是关于Python Pandas Dataframe 将特定的日期时间行标签设置为索引中的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

python 将Numpy数组转换为Pandas Dataframe

python pandas中如何将dataframe中的一列字符串类型转换为浮点类型?

python 将Pandas Dataframe导出到csv(无索引)

python 将Pandas Dataframe导出到Excel文件中

python Pandas - 将系列转换为DataFrame,顶部有列

Python/Pandas:如何将字符串列表与 DataFrame 列匹配