Python 有没有什么有效的方法可以在大数据帧中同时过滤掉集群数据?

Python 有没有什么有效的方法可以在大数据帧中同时过滤掉集群数据?,python,pandas,cluster-analysis,Python,Pandas,Cluster Analysis,我有一个大熊猫数据框,看起来像这样: DF: ID setID Weight PG_002456788.1 1 100 UG_004678935.1 2 110 UG_012975895.1 2 150 PG_023788904.1 3 200 UR_073542247.1 3 200 UR_099876678.2 3 264

我有一个大熊猫数据框,看起来像这样:

DF:
ID               setID      Weight
PG_002456788.1    1         100
UG_004678935.1    2         110
UG_012975895.1    2         150
PG_023788904.1    3         200
UR_073542247.1    3         200
UR_099876678.2    3         264
PR_066120875.1    4         400
PR_098759678.1    4         600
UR_096677888.2    4         750
PG_012667994.1    5         800
PG_077555239.1    5         800
我想根据以下条件筛选出行:

根据setID选择代表的标准的优先级顺序如下

Preference 1 ID starting with PG_
Preference 2 ID starting with UG_
Preference 3 ID starting with PR_
Preference 4 ID starting with UR_
除此之外,下一个优先事项是为每个setID集群同时选择最高权重

'所需输出:'

ID              setID   weight
PG_002456788.1    1      100
UG_012975895.1    2      150
PG_023788904.1    3      200
PR_098759678.1    4      600
PG_012667994.1    5      800
此外,我想打印具有相同ID“缩写”的行,如果有,还可以单独打印重量

For example,

  ID             setID      weight
 PG_012667994.1    5        800
 PG_077555239.1    5        800
IIUC您可以使用
ID
中的初始子字符串定义一个虚拟列,并使用它和
权重对数据帧进行排序。然后groupby
setID
,首先获取

df['ID_init'] = pd.Categorical(df.ID.str.split('_',1).str[0],
                               categories=['PG','UG','PR','UR'],
                               ordered=True)

(df.sort_values(by=['ID_init','Weight'], ascending=[True, False])
   .groupby('setID')
   .head(1)
   .sort_values('setID')
   .drop('ID_init',1))

               ID  setID  Weight
0  PG_002456788.1      1     100
2  UG_012975895.1      2     150
3  PG_023788904.1      3     200
7  PR_098759678.1      4     600
9  PG_012667994.1      5     800
IIUC您可以使用
ID
中的初始子字符串定义一个虚拟列,并使用它和
权重对数据帧进行排序。然后groupby
setID
,首先获取

df['ID_init'] = pd.Categorical(df.ID.str.split('_',1).str[0],
                               categories=['PG','UG','PR','UR'],
                               ordered=True)

(df.sort_values(by=['ID_init','Weight'], ascending=[True, False])
   .groupby('setID')
   .head(1)
   .sort_values('setID')
   .drop('ID_init',1))

               ID  setID  Weight
0  PG_002456788.1      1     100
2  UG_012975895.1      2     150
3  PG_023788904.1      3     200
7  PR_098759678.1      4     600
9  PG_012667994.1      5     800

对于第一部分:从ID创建一个名为code的新列。然后,按代码和权重对数据帧进行排序,按setID分组并获取第一个条目

df['code'] = df['ID'].str[:2].replace({'PG': 1, 'UG': 2, 'PR': 3, 'UR': 4})
df2 = df.sort_values(['code', 'Weight'], ascending=[True, False]).groupby('setID').first()
df2 = df2.reset_index().drop('code', axis=1)
输出

   setID              ID  Weight
0      1  PG_002456788.1     100
1      2  UG_012975895.1     150
2      3  PG_023788904.1     200
3      4  PR_098759678.1     600
4      5  PG_012667994.1     800
第二部分:

df3 = df.join(df.groupby(['setID', 'code']).count()['ID'],
        on=['setID', 'code'], rsuffix='_Count')
df3[ df3['ID_Count'] > 1].drop(['code', 'ID_Count'], axis=1)
输出:

                ID  setID  Weight
1   UG_004678935.1      2     110
2   UG_012975895.1      2     150
4   UR_073542247.1      3     200
5   UR_099876678.2      3     264
6   PR_066120875.1      4     400
7   PR_098759678.1      4     600
9   PG_012667994.1      5     800
10  PG_077555239.1      5     800

对于第一部分:从ID创建一个名为code的新列。然后,按代码和权重对数据帧进行排序,按setID分组并获取第一个条目

df['code'] = df['ID'].str[:2].replace({'PG': 1, 'UG': 2, 'PR': 3, 'UR': 4})
df2 = df.sort_values(['code', 'Weight'], ascending=[True, False]).groupby('setID').first()
df2 = df2.reset_index().drop('code', axis=1)
输出

   setID              ID  Weight
0      1  PG_002456788.1     100
1      2  UG_012975895.1     150
2      3  PG_023788904.1     200
3      4  PR_098759678.1     600
4      5  PG_012667994.1     800
第二部分:

df3 = df.join(df.groupby(['setID', 'code']).count()['ID'],
        on=['setID', 'code'], rsuffix='_Count')
df3[ df3['ID_Count'] > 1].drop(['code', 'ID_Count'], axis=1)
输出:

                ID  setID  Weight
1   UG_004678935.1      2     110
2   UG_012975895.1      2     150
4   UR_073542247.1      3     200
5   UR_099876678.2      3     264
6   PR_066120875.1      4     400
7   PR_098759678.1      4     600
9   PG_012667994.1      5     800
10  PG_077555239.1      5     800