我有一个名为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
这样的数字
然后按预期工作
谢谢
答案 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'])