[英]Pandas: Dataframe itertuples boolean series groupby optimization
我是python的新手。 我有數據框(DF)示例:
ID | 類型 |
---|---|
1 | 一種 |
1 | 乙 |
2 | C |
2 | 乙 |
我想按 id 添加列示例 A_flag 組。 最后我有數據框(DF):
ID | 類型 | 一只旗 |
---|---|---|
1 | 一種 | 1 |
1 | 乙 | 1 |
2 | C | 0 |
2 | 乙 | 0 |
我可以分兩步做到這一點:
DF['A_flag_tmp'] = [1 if x.type=='A' else 0 for x in DF.itertuples()]
DF['A_flag'] = DF.groupby(['id'])['A_flag_tmp'].transform(np.max)
它正在工作,但對於大數據幀來說非常慢。 有沒有辦法優化這種情況? 感謝幫助。
通過替換 Pandas 內置函數生成布爾系列的第一步,將慢速迭代編碼的代碼更改為快速矢量化編碼,例如
df['type'].eq('A')
然后,您可以將其附加到第二步的 groupby 語句中,如下所示:
df['A_flag'] = df['type'].eq('A').groupby(df['id']).transform('max').astype(int)
結果
print(df)
id type A_flag
0 1 A 1
1 1 B 1
2 2 C 0
3 2 B 0
一般來說,如果你有更復雜的條件,你也可以用矢量化的方式定義它,例如。 通過以下方式定義布爾系列m
:
m = df['type'].eq('A') & df['type1'].gt(1) | (df['type2'] != 0)
然后,在步驟 2 中使用它,如下所示:
m.groupby(df['id']).transform('max').astype(int)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.