用一组字符串对pandas序列重新编制索引将删除序列中的原始数据

2024-03-29 14:38:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为day\u counts的系列,通常包含7个值,但可以这样看。0对应星期一到6,星期天。你知道吗

Name: dow, dtype: int64
0    332
1    722
2    721

但是索引需要有7个值长(一周中的几天),所以我重新索引了这个序列,但是使用了一个字符串列表作为索引。代码如下所示(scrobbles是从csv文件读取的数据帧):

_scrobbles = self.scrobbles.query('month == ' + str(self.month))
_scrobbles['text_timestamp'] = pd.to_datetime(_scrobbles['text_timestamp'])
_scrobbles['dow'] = _scrobbles['text_timestamp'].map(lambda x: x.weekday())
data = _scrobbles['dow'].value_counts().sort_index()
day_counts = pd.Series(data=data)
new_index = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
day_counts_new = day_counts.reindex(index=new_index, fill_value=0)

这将创建新索引,但任何现有数据都会被0覆盖,并输出以下内容:

Mon    0
Tue    0
Wed    0
Thu    0
Fri    0
Sat    0
Sun    0
Name: dow, dtype: int64

应该是这样的

Mon    332
Tue    722
Wed    721
Thu    0
Fri    0
Sat    0
Sun    0

有人知道我如何保存现有数据吗?你知道吗

有趣的是,如果我将索引设置为像这样的数字new_index = [0, 1, 2, 3, 4, 5, 6]

然后它就按预期工作了

谢谢


Tags: 数据textnewdataindextimestampdaycounts
3条回答

我假设你有:

  • day_counts,例如pd.Series([ 332, 722, 721 ])
  • new_index = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']

要创建结果,请从包含7个零的系列开始:

dc = pd.Series(7 * [0])

然后用day_counts更新它:

dc.update(day_counts)

结果是您有一个包含7个项目的系列,初始项目 从day_counts和剩余项=0。你知道吗

然后用new_index替换dc中的索引:

dc.index = new_index

结果是:

Mon    332
Tue    722
Wed    721
Thu      0
Fri      0
Sat      0
Sun      0

编辑

请在下面找到整个问题的一个稍微改变的解决方案, 基于groupby,即使没有任何辅助表和更新:

import pandas as pd

# Source data
df = pd.DataFrame([ '2018-12-01', '2018-12-02', '2018-12-03', '2018-12-01' ],
    columns=['text_timestamp'])
# Change dates from string to datetime
df.text_timestamp = pd.to_datetime(df.text_timestamp)
# Add dow column
df['dow'] = df.text_timestamp.dt.dayofweek
# Compute day counts
day_counts = df.groupby('dow')['text_timestamp'].count()\
    .reindex(range(0, 7), fill_value=0)
# Change index
day_counts.index = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']

对于上述数据,结果是:

Mon    1
Tue    0
Wed    0
Thu    0
Fri    0
Sat    2
Sun    1
>>> df = pd.DataFrame([332,722,721,0,0,0,0])
>>> df
     0
0  332
1  722
2  721
3    0
4    0
5    0
6    0
>>> new_index = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
>>> df.set_index(pd.Series(new_index))
       0
Mon  332
Tue  722
Wed  721
Thu    0
Fri    0
Sat    0
Sun    0

只需确保初始数据帧的长度与new_index相同。但正如你在帖子的开头所说,它通常包含7个值,所以不用担心。你知道吗

我通过创建dictionary并将平日列表压缩到初始序列,然后从dictionary创建一个dataframe来解决这个问题。你知道吗

hour_counts = _scrobbles['dow'].value_counts().sort_index() 
days = 'Mon Tue Wed Thu Fri Sat Sun'.split()
df = pd.DataFrame(list(dict(zip(days, hour_counts)).items()), columns=['Month', 'Count'])

相关问题 更多 >