我有一个数据框,其中包含不同ID的每月记录,并且我只需要对具有多个记录月的ID进行一些分析。
ID Month Metric1 Metric2
1 2018-01-01 4 3
1 2018-02-01 3 2
2 2018-02-01 1 5
3 2018-01-01 4 2
3 2018-02-01 6 3
4 2018-01-01 3 1
我将如何过滤出仅出现一次的ID行,并将其保留为多行并得到类似的结果
ID Month Metric1 Metric2
1 2018-01-01 4 3
1 2018-02-01 3 2
3 2018-01-01 4 2
3 2018-02-01 6 3
我看过其他一些提到的页面,例如:
df = df[df.groupby('ID').ID.transform(len) > 1]
但是我不想通过分组丢失每个月的指标。
答案 0 :(得分:4)
将len
更改为count
df[df.groupby('ID').ID.transform('count') > 1]
Out[589]:
ID Month Metric1 Metric2
0 1 2018-01-01 4 3
1 1 2018-02-01 3 2
3 3 2018-01-01 4 2
4 3 2018-02-01 6 3
答案 1 :(得分:3)
df1=df[df.ID.duplicated(keep=False)]
print(df1)
ID Month Metric1 Metric2
0 1 2018-01-01 4 3
1 1 2018-02-01 3 2
3 3 2018-01-01 4 2
4 3 2018-02-01 6 3
答案 2 :(得分:3)
filter
我不能保证这个的速度,但是这就是该API的目的...
df.groupby('ID').filter(lambda d: len(d) > 1)
ID Month Metric1 Metric2
0 1 2018-01-01 4 3
1 1 2018-02-01 3 2
3 3 2018-01-01 4 2
4 3 2018-02-01 6 3
@ Wen-Ben答案的数字版
u, i = np.unique(df.ID.values, return_inverse=True)
df[np.bincount(i)[i] > 1]
ID Month Metric1 Metric2
0 1 2018-01-01 4 3
1 1 2018-02-01 3 2
3 3 2018-01-01 4 2
4 3 2018-02-01 6 3
因为我很好奇...
s0 = set()
s1 = set()
for i in df.ID:
if i in s0:
s1.add(i)
s0.add(i)
df[df.ID.map(s1.__contains__)]
ID Month Metric1 Metric2
0 1 2018-01-01 4 3
1 1 2018-02-01 3 2
3 3 2018-01-01 4 2
4 3 2018-02-01 6 3