Python pandas - 根据缺少的区域代码删除分组行
Python pandas - Dropping grouped rows based on missing territory code
在下面的 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' 但我不确定如何搜索地区列以查看它是否包含 "US"领土。任何帮助将不胜感激!
df.groupby(['Mix_Name', 'Track', 'Artist']).filter(lambda x: (x['Territories'].str.contains('US').any()))
您进行分组,然后过滤组以检查地区列是否包含 'US'。
编辑
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 中过滤掉。
请澄清这是否不正确,但我认为您正在尝试:
识别 'Territories' 中没有 US 的所有曲目,然后删除该曲目所属的整个 Mix。
如果是这样,您可以通过以下操作实现此目标..
#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)]
希望这有助于或引导您朝着正确的方向前进
在下面的 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' 但我不确定如何搜索地区列以查看它是否包含 "US"领土。任何帮助将不胜感激!
df.groupby(['Mix_Name', 'Track', 'Artist']).filter(lambda x: (x['Territories'].str.contains('US').any()))
您进行分组,然后过滤组以检查地区列是否包含 'US'。
编辑
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 中过滤掉。
请澄清这是否不正确,但我认为您正在尝试:
识别 'Territories' 中没有 US 的所有曲目,然后删除该曲目所属的整个 Mix。
如果是这样,您可以通过以下操作实现此目标..
#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)]
希望这有助于或引导您朝着正确的方向前进