我有一个类似于下面的Pandas DataFrame,我试图将DataFrame拆分为一周长的块,并在每个块上运行一个函数。我相信这应该可以通过groupby
和date_range
函数来完成,但我遇到了一些麻烦。
我见过其他人用日期作为索引做类似的事情。但是,这在这种情况下不起作用,因为df中的多行可能具有相同的日期。此外,每个日期都没有在df中表示。
groupby
和/或date_range
函数我做错了什么?
一旦我明白这一点,我想使用nx.from_pandas_dataframe
为每周长的块创建一个网络,并计算每个块中的节点数。
# create list of edges with 'source', 'target', 'timestamp'
edges = [('e', 'a1', '12/02/2015'),
('e', 'a2', '12/02/2015'),
('e', 'a3', '12/03/2015'),
('e', 'a4', '12/04/2015'),
('e', 'a5', '12/04/2015'),
('e', 'a1', '12/08/2015'),
('e', 'a2', '12/09/2015'),
('e', 'a6', '12/09/2015'),
('e', 'a7', '12/13/2015'),
('e', 'a1', '12/15/2015'),
('e', 'a6', '12/16/2015'),
('e', 'a8', '12/17/2015'),
('e', 'a9', '12/18/2015')]
# create a DataFrame from edges
df = pd.DataFrame(edges, columns=['source', 'target', 'date'], )
# sort df by date and identify first and last date
df.sort(columns=['date'], ascending=True, inplace=True)
first_date = df.date.irow(0)
last_date = df.date.irow(-1)
df.groupby(pd.date_range(start=first_date, end=last_date, freq='W'))
AssertionError: Grouper and axis must be same length
答案 0 :(得分:1)
可能有更好的,但这是一个解决方案。我创建了一个键入年/周元组对的数据帧字典。
首先,我在年/周元组对的数据框中创建一个列。然后我使用词典理解来分组这个专栏。
df['year_week'] = [(d.year, d.week) for d in df['date']]
weekly_groups = {w: g for w, g in df.groupby('year_week')}
>>> weekly_groups
{(2015, 49): source target date year_week
0 e a1 2015-12-02 (2015, 49)
1 e a2 2015-12-02 (2015, 49)
2 e a3 2015-12-03 (2015, 49)
3 e a4 2015-12-04 (2015, 49)
4 e a5 2015-12-04 (2015, 49),
(2015, 50): source target date year_week
5 e a1 2015-12-08 (2015, 50)
6 e a2 2015-12-09 (2015, 50)
7 e a6 2015-12-09 (2015, 50)
8 e a7 2015-12-13 (2015, 50),
(2015, 51): source target date year_week
9 e a1 2015-12-15 (2015, 51)
10 e a6 2015-12-16 (2015, 51)
11 e a8 2015-12-17 (2015, 51)
12 e a9 2015-12-18 (2015, 51)}