Python大熊猫-根据缺少的区域代码删除分组的行

时间:2019-07-17 23:08:58

标签: python pandas pandas-groupby contains

在下面的df中,我们有两个“ Mixes”,如Mix_Name和Mix_ID列所示。在这些混合中的每一个中,都有多个轨道,这些轨道具有唯一的Track_ID,其中包含不同的地区(请参见“地区”列)。

Mix_Name    Mix_ID  Territories     Track_Title  Artist         Track_ID
Mix Vol 1   abc123  GB | US | MX    Cabala       Prok & Fitch   12345678
Mix Vol 1   abc123  US | CA         Autosave     Fedde          9101112
Mix Vol 1   abc123  US | CA         4 Life       Firebeatz      4151617
Mix Vol 1   abc123  IE | MX         4 Life       Firebeatz      18192021
Mix Vol 2   xyz456  CA              Warrior      My Nu Leng     22232425
Mix Vol 2   xyz456  FR | DE | NE    Warrior      My Nu Leng     27282930
Mix Vol 2   xyz456  US | CA         I'm Madonna  Madonna        31323334
Mix Vol 2   xyz456  CA | US | FR    Trouble      Gregor Salto   35363738

我在这里希望做的是找出哪些轨道不具有美国领土,如果任何轨道不具有美国领土,我将要从数据框中删除整个组合。得到的数据框看起来像这样,因为“ Mix Vol 2”在其轨道之一中缺少美国领土:

Mix_Name    Mix_ID  Territories     Track_Title  Artist         Track_ID
Mix Vol 1   abc123  GB | US | MX    Cabala       Prok & Fitch   12345678
Mix Vol 1   abc123  US | CA         Autosave     Fedde          9101112
Mix Vol 1   abc123  US | CA         4 Life       Firebeatz      4151617
Mix Vol 1   abc123  IE | MX         4 Life       Firebeatz      18192021

我知道我需要Groupby:“ Mix_ID”,“ Track_Title”和“ Artist”,但是我不确定如何搜索“地区”列以查看其是否包含“美国”地区。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

df.groupby(['Mix_Name', 'Track', 'Artist']).filter(lambda x: (x['Territories'].str.contains('US').any()))

您进行分组依据,然后过滤分组以检查“地区”列中是否包含“美国”。

编辑

notInUS = df.groupby(['Mix_Name','Track_Title','Artist']).filter(lambda x: ~x['Territories'].str.contains('US').any())['Mix_Name'].unique()
df[~df['Mix_Name'].isin(notInUS)]

我们可以查找在美国没有曲目的唯一Mix_Name,然后将其从我们的主df中过滤掉。

答案 1 :(得分:0)

请澄清是否正确,但是,我认为您正在尝试:

识别“领土”中没有美国的任何曲目,然后删除该曲目所属的整个混音。

如果是这样,您可以执行以下操作。

#get list of all Mix_Names that have at least 1 track without US in Territories
mixes_to_drop=df[~df['Territories'].str.contains('US')]['Mix_Name'].unique().tolist()
#filter out the mixes that have a 'Mix_Name' that is in the list of mixes to drop
df[~df['Mix_Name'].isin(mixes_to_drop)]

希望这有助于或指导您正确的方向