Python 熊猫使用groupby和avoid循环创建新列

Python 熊猫使用groupby和avoid循环创建新列,python,pandas,dataframe,group-by,Python,Pandas,Dataframe,Group By,我有一个带有客户id、年份、订单和一些其他但不重要的列的df。每次我收到新订单时,我的代码都会创建一个新行,因此每个客户id可以有多行。我想创建一个新列“实际”,如果客户id是在2020年或2021年购买的,则包含“True”。我的代码是: #Run through all customers and check if they bought in 2020 or 2021 investors = df["customer_id"].unique() df["act

我有一个带有客户id、年份、订单和一些其他但不重要的列的df。每次我收到新订单时,我的代码都会创建一个新行,因此每个客户id可以有多行。我想创建一个新列“实际”,如果客户id是在2020年或2021年购买的,则包含“True”。我的代码是:

#Run through all customers and check if they bought in 2020 or 2021
investors = df["customer_id"].unique()
df["actually"] = np.nan
for i in investors:
    selected_df = df.loc[df["customer_id"] == i]
    for year in selected_df['year'].unique():
        if "2021" in str(year) or "2020" in str(year):
            df.loc[df["customer_id"] == i, "actually"] = "True"
            break
#Want just latest orders / customers
df = df.loc[df["actually"] == "True"]

这很好,但速度很慢。我想使用Pandas groupby函数,但到目前为止还没有找到一种有效的方法。我也避免循环。有人有想法吗?

您可以使用apply方法来避免循环:

df['actually']=df['customer_id'].apply(lambda x: df[df.customer_id==x]['year'].str.contains('2020').any() or df[df.customer_id==x]['year'].str.contains('2021').any())

您可以创建类似这样的列名“实际上”

list1=df['Customer_id'][df.year==2020].unique()
list2=df['Customer_id'][df.year==2021].unique()
df['Actually']=df['Customer_id'].apply( lambda x : x in list1 or x in list2)

根据我对您的scaenario的理解,以下是一个简单的代码:

作为pd进口熊猫 用于重新创建场景的示例数据 数据={'customer_id':['c1','c2','c1','c4','c3','c3','c3','year':[2019,20182021201220202021],'order':['A1','A2','A3','A4','A5','A6'] df=pd.DataFrame.from_dictdata 创建新列最初全部为false df['actual']=False 仅用True填充所需行 df.loc[df['year']==2020年| df['year']==2021年,'实际']=True printdf 这将产生:

客户身份证实际年份订单 0 c1 2019 A1错误 1 c2 2018 A2错误 2 c1 2021 A3正确 3 c4 2012 A4假 4 c3 2020 A5正确 5 c3 2021 A6正确
请将示例数据框与预期输出共享您的输入和输出数据框请阅读,这不仅仅是一个伪装的循环吗?我认为比循环更好。我在这里看不到任何更快的方法,比如np.where,因为条件不是按行的