熊猫-groupby-具有间隔/日期范围的get_group

时间:2018-08-07 18:43:19

标签: python python-3.x pandas pandas-groupby

我正在尝试使用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

1 个答案:

答案 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