Python熊猫:有没有一种更快的方法可以根据标准拆分和重新组合数据帧?

Python熊猫:有没有一种更快的方法可以根据标准拆分和重新组合数据帧?,python,pandas,dataframe,split,Python,Pandas,Dataframe,Split,我希望根据特定列“ContactID”对该数据帧进行分组,但如果该组的列“PaymentType”不包含特定值,则我希望从数据帧中删除整个组 我有这样的想法: UniqueID = data.drop_duplicates('ContactID')['ContactID'].tolist() OnlyRefinance=[] for i in UniqueID: splits = data[data['ContactID']==i].reset_index(drop=True)

我希望根据特定列“ContactID”对该数据帧进行分组,但如果该组的列“PaymentType”不包含特定值,则我希望从数据帧中删除整个组

我有这样的想法:

UniqueID = data.drop_duplicates('ContactID')['ContactID'].tolist()
OnlyRefinance=[]
for i in UniqueID:
    splits = data[data['ContactID']==i].reset_index(drop=True)
    if any(splits['PaymentType']==160):
        OnlyRefinance.append(splits)
OnlyRefinance = pd.concat(OnlyRefinance)

这是可行的,但速度非常慢,我想知道是否有更快的方法来实现这一点。

您可以通过执行以下操作来轻松完成:

to_drop = data.loc[data['PaymentType'] == 160, 'ContactID'].unique()
data[~data['ContactID'].isin(to_drop)]
因此,首先筛选出所有不符合条件的行,并获取我们想要删除的唯一联系人ID


然后将这些信息传递到isin,并使用
~
反转遮罩。这将删除此阵列中ContactID所在的所有行。

您可以使用另一个选项
groupby.filter

data.groupby("ContactID").filter(lambda g: (g.PaymentType == 160).any())

这将只保留PaymentType包含160的组。

这是一个很好的简单解决方案+1@EdChum谢谢,非常感谢。这太完美了!谢谢EdChum!这是一个很好的解决方案