Pandas Groupby:获取最早ID的所有行(具有许多ID的大型数据集)

时间:2019-12-02 22:45:46

标签: pandas pandas-groupby

我有一个df框架,其中包含ID及其关联列的每月值。 ID和月份有“组”的行。每个ID最多可能需要12个月的数据。 我想要所有ID的所有数据行,其中月份是每个ID的最早日期

数据看起来像

    +-------+----+--------+-------------+-------------+----------+
| index | ID |  Date  |      X      |      Y      | Category |
+-------+----+--------+-------------+-------------+----------+
|     0 |  1 | 1/1/18 | 0.118758835 | 0.954677438 | A        |
|     1 |  1 | 1/1/18 | 0.148103273 | 0.976617504 | B        |
|     2 |  1 | 1/1/18 | 0.365541214 | 0.551642346 | C        |
|     3 |  1 | 1/2/18 | 0.405002687 | 0.343279097 | A        |
|     4 |  1 | 1/2/18 | 0.130580643 | 0.144486528 | B        |
|     5 |  1 | 1/2/18 | 0.395113106 | 0.113118681 | C        |
|     6 |  2 | 1/1/18 | 0.425580038 | 0.725166189 | A        |
|     7 |  2 | 1/1/18 | 0.889677796 | 0.386824338 | B        |
|     8 |  2 | 1/1/18 | 0.835311629 | 0.363802849 | C        |
|     9 |  2 | 1/2/18 | 0.8375818   | 0.769265522 | A        |
|    10 |  2 | 1/2/18 | 0.648162611 | 0.075286355 | B        |
|    11 |  2 | 1/2/18 | 0.639060695 | 0.791222309 | C        |
+-------+----+--------+-------------+-------------+----------+

我想知道我是否可以使用Groupby来处理要输出的数据

    +-------+----+--------+-------------+-------------+----------+
| index | ID |  Date  |      X      |      Y      | Category |
+-------+----+--------+-------------+-------------+----------+
|     0 |  1 | 1/1/18 | 0.118758835 | 0.954677438 | A        |
|     1 |  1 | 1/1/18 | 0.148103273 | 0.976617504 | B        |
|     2 |  1 | 1/1/18 | 0.365541214 | 0.551642346 | C        |
|     6 |  2 | 1/1/18 | 0.425580038 | 0.725166189 | A        |
|     7 |  2 | 1/1/18 | 0.889677796 | 0.386824338 | B        |
|     8 |  2 | 1/1/18 | 0.835311629 | 0.363802849 | C        |
+-------+----+--------+-------------+-------------+----------+

``

N.B在输出df中保留了相同的索引号以显示我要获取的行

注意:每个ID的类别数量不同,即不能仅获取n行-每个ID必须使用最早的月份

我编写了一个python循环,该循环遍历每个id,然后选择日期最早的行,但是具有2GB以上的大型数据集,速度非常慢。希望这是足够的信息。

如果Groupby不适合,则欢迎使用其他方法

更新:

我对此进行了更多调查,并提出了解决方案
参见StackOverflow Pandas groupby rank date time

使用groupby和rank在ID级别上创建一个DateRank列

  df['DateRank'] = df.groupby('ID')['Date'].rank(method='dense', ascending=True)

第1级过滤器(第一个条目)

xdf = df [df ['DateRank'] == 1.0]

删除排名列

xdf.drop('DateRank',axis = 1,inplace = True)

打印数据框

xdf

2 个答案:

答案 0 :(得分:0)

下面的函数将返回按ID和类别分组的最小值

df=df.groupby(["ID","Category"], group_keys=False).apply(lambda g: g.nsmallest(1, "Date"))

答案 1 :(得分:0)

首先,您应该创建一个月份列。然后返回每个[ID,类别]组中月份值最小的行。

计算

df['month'] = df['Date'].map(lambda x: int(x.split("/")[1])) # get month
df = df.groupby(["ID","Category"])['month'].nsmallest(1) # get earliest month for each ID+category observation

输出

print(df.to_string())
  index ID    Date            X            Y Category  month
0     0  1  1/1/18  0.118758835  0.954677438        A      1
1     1  1  1/1/18  0.148103273  0.976617504        B      1
2     2  1  1/1/18  0.365541214  0.551642346        C      1
6     6  2  1/1/18  0.425580038  0.725166189        A      1
7     7  2  1/1/18  0.889677796  0.386824338        B      1
8     8  2  1/1/18  0.835311629  0.363802849        C      1