首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pandas - groupby - get_group,间隔/日期范围

Pandas - groupby - get_group,间隔/日期范围
EN

Stack Overflow用户
提问于 2018-08-08 02:43:19
回答 1查看 559关注 0票数 1

我尝试在get_group()方法中使用间隔/日期范围。

代码语言:javascript
运行
复制
ranges = pd.date_range(start='1/1/1900', periods=12, freq='120M')
dates = df.groupby(pd.cut(df['dob'], ranges))

我知道通常你可以使用dates.get_group('groupName')。但是,由于我使用的是日期范围,所以无法使其正常工作。可以将get_group()与日期范围/时间间隔一起使用吗?如果是这样,正确的语法是什么?

我的目标是能够从特定的组中选择一个数据帧。也许还有别的办法?谢谢!

示例数据:https://drive.google.com/file/d/1sA_EdrBAVuNCcUQRjj09wmaSCUgiAeif/view?usp=sharing

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-08 02:52:51

一种可能的解决方案是添加参数labels

代码语言:javascript
运行
复制
df = pd.read_csv('dataForStackOverflow.csv', parse_dates=[2])
print (df.head())
     id     last_name        dob
0  1793     Abdelnaby 1968-06-24
1  3299    Abdul-Aziz 1946-04-07
2  3218  Abdul-Jabbar 1947-04-16
3  1753    Abdul-Rauf 1969-03-09
4  1382   Abdul-Wahad 1974-11-03

ranges = pd.date_range(start='1/1/1900', periods=12, freq='120M')

labels = ['{}s'.format(i.strftime('%Y')) for i in ranges[1:]]
print (ranges)
DatetimeIndex(['1900-01-31', '1910-01-31', '1920-01-31', '1930-01-31',
               '1940-01-31', '1950-01-31', '1960-01-31', '1970-01-31',
               '1980-01-31', '1990-01-31', '2000-01-31', '2010-01-31'],
              dtype='datetime64[ns]', freq='120M')

print (labels)
['1910s', '1920s', '1930s', '1940s', '1950s', '1960s', '1970s', 
 '1980s', '1990s', '2000s', '2010s']

然后通过将groupby对象转换为元组和字典来创建dictionary of Dataframes

代码语言:javascript
运行
复制
dates = dict(tuple(df.groupby(pd.cut(df['dob'], bins=ranges, labels=labels))))

print (dates['1940s'])
      id last_name        dob
7   3844      Able 1932-07-27
11  3895  Ackerman 1930-09-04
36  3742    Alcorn 1936-10-08

print (dates['1950s'])
      id     last_name        dob
1   3299    Abdul-Aziz 1946-04-07
2   3218  Abdul-Jabbar 1947-04-16
13  3579         Acton 1942-01-11
20  3063         Adams 1949-05-15
21  3178         Adams 1947-11-27
23  3287       Adelman 1946-06-16
30  3417         Aitch 1944-09-21
32  3425          Akin 1944-07-31

如果没有labels,则可以使用Interval

代码语言:javascript
运行
复制
dates = dict(tuple(df.groupby(pd.cut(df['dob'], bins=ranges))))

interv = pd.Interval(pd.Timestamp('1930-01-31'), pd.Timestamp('1940-01-31'))
print (interv)
(1930-01-31, 1940-01-31]

print (dates[interv])
      id last_name        dob
7   3844      Able 1932-07-27
11  3895  Ackerman 1930-09-04
36  3742    Alcorn 1936-10-08
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51733456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档