用一组字符串重新索引熊猫系列会删除该系列中的原始数据

时间:2018-12-30 18:07:43

标签: python pandas

我有一个名为day_counts的序列,该序列通常包含7个值,但看起来可能像这样。 0对应于星期一,直到6,即星期日。

androidTest

但是索引的长度必须是7个值(一周中的几天),因此我重新索引了该系列,但是使用字符串列表作为索引。代码如下所示(_scrobbles是从csv文件读取的数据帧):

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

这将创建新索引,但是所有现有数据都会被0覆盖,输出如下:

_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)

应该看起来像这样

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 这样的数字

然后按预期工作

谢谢

3 个答案:

答案 0 :(得分:2)

>>> 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个值,因此不用担心。

答案 1 :(得分:1)

我认为您有:

  • 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。

然后将dc中的索引替换为new_index

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

答案 2 :(得分:0)

我通过创建字典并将工作日列表压缩到初始系列中,然后从字典中创建数据框来解决此问题。

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'])