我有一个DataFrame,如下所示:
VID value
1 1 xx
2 2 xx1
3 2 xx2
4 2 xx3
5 2 xx4
6 3 xx
7 3 xx
8 3 xx
9 4 zz1
10 4 zz2
11 4 zz3
12 4 zz4
13 4 zz5我只想保留VID在多个n=3情况下存在的行。在上面的例子中,我只保留2-5行和9-13行(因为只有VIDs 2和4出现超过3次)。“value”字段与此无关。
在保留所需的行之后,我希望将数据转换为列表列表,同时在每个行的末尾追加一个“end”值:
[[xx1, xx2, xx3, xx4, 'end'], [zz1, zz2, zz3, zz4, zz5, 'end']]在不使用for循环的情况下,是否有可能获得上述信息?
发布于 2015-10-20 15:46:41
您可以按VID列分组,然后计算每个组的数量。然后,使用它来索引原始df,以便只使用大于3计数的行。例子-
countdf = df.groupby('VID').count()
result = df.loc[df['VID'].isin(countdf[countdf['value'] > 3].index)]演示-
In [49]: df
Out[49]:
VID value
1 1 xx
2 2 xx1
3 2 xx2
4 2 xx3
5 2 xx4
6 3 xx
7 3 xx
8 3 xx
9 4 zz1
10 4 zz2
11 4 zz3
12 4 zz4
13 4 zz5
In [51]: df.groupby('VID').count()
Out[51]:
value
VID
1 1
2 4
3 3
4 5
In [52]: countdf = df.groupby('VID').count()
In [53]: df.loc[df['VID'].isin(countdf[countdf['value'] > 3].index)]
Out[53]:
VID value
2 2 xx1
3 2 xx2
4 2 xx3
5 2 xx4
9 4 zz1
10 4 zz2
11 4 zz3
12 4 zz4
13 4 zz5然后,您可以基于VID再次分组,然后将这些组转换为list,然后再将其列表,例如-
resultlist = result.groupby('VID')['value'].apply(list).tolist()演示-
In [54]: result = df.loc[df['VID'].isin(countdf[countdf['value'] > 3].index)]
In [55]: result.groupby('VID')['value'].apply(list).tolist()
Out[55]: [['xx1', 'xx2', 'xx3', 'xx4'], ['zz1', 'zz2', 'zz3', 'zz4', 'zz5']]请注意,上面不会给您列表中的'end'值,我猜这是不必要的,但是如果您真的想要,可以在获得列表后手动添加它。例子-
resultlist = [elem + ['end'] for elem in resultlist]https://stackoverflow.com/questions/33240937
复制相似问题