我有一个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
Run Code Online (Sandbox Code Playgroud)
我想只保留VID存在的行超过n = 3种情况.在上述例子中,我只保留行2-5和9-13(因为只有VID的2和4出现3次以上)."价值"字段无关紧要.
保留所需的行后,我想将我的数据转换为列表列表,同时在每个列的末尾附加一个"结束"值:
[[xx1, xx2, xx3, xx4, 'end'], [zz1, zz2, zz3, zz4, zz5, 'end']]
Run Code Online (Sandbox Code Playgroud)
是否有可能在没有for循环的情况下获得上述内容?
您可以按VID列分组,然后计算每个组的计数.然后使用它来索引原始df,以便只获取大于3的行数.示例 -
countdf = df.groupby('VID').count()
result = df.loc[df['VID'].isin(countdf[countdf['value'] > 3].index)]
Run Code Online (Sandbox Code Playgroud)
演示 -
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
Run Code Online (Sandbox Code Playgroud)
然后在此之后,您可以再次进行分组VID,然后将组转换为然后再转换list为列表,示例 -
resultlist = result.groupby('VID')['value'].apply(list).tolist()
Run Code Online (Sandbox Code Playgroud)
演示 -
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']]
Run Code Online (Sandbox Code Playgroud)
请注意,上面不会得到'end'列表中的值,我猜这是没有必要的,但如果你真的想要,你可以在获得列表后手动添加它.示例 -
resultlist = [elem + ['end'] for elem in resultlist]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1672 次 |
| 最近记录: |