我有一个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
df['DateRank'] = df.groupby('ID')['Date'].rank(method='dense', ascending=True)
xdf = df [df ['DateRank'] == 1.0]
xdf.drop('DateRank',axis = 1,inplace = True)
xdf
答案 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