我正在尝试使用get_group()方法使用间隔/日期范围。
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
答案 0 :(得分:0)
一种可能的解决方案是添加参数labels
:
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']
然后通过将dictionary of Dataframes
对象转换为元组和字典来创建groupby
:
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
:
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