在下面的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”,但是我不确定如何搜索“地区”列以查看其是否包含“美国”地区。任何帮助将不胜感激!
答案 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)]
希望这有助于或指导您正确的方向