簡體   English   中英

在Pandas中保留相同ID出現n次以上的行並轉換為每個ID列表

[英]Keeping rows in Pandas where the same ID appears more than n times and convert to list per ID

我有一個如下所示的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行(因為只有VID 2和4出現的次數超過3次)。 “價值”字段無關緊要。

保留所需的行后,我想將我的數據轉換為列表列表,同時在每個列的末尾附加一個“結束”值:

[[xx1, xx2, xx3, xx4, 'end'], [zz1, zz2, zz3, zz4, zz5, 'end']]

是否有可能在沒有for循環的情況下獲得上述內容?

您可以按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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM