[英]How to merge dataframe rows with different values in Pandas
我有以下數據框,其中包含用戶提出的請求數據:
user_id status
1 IN_ANALYSIS
1 APPROVED
1 DISAPPROVED
2 IN_ANALYSIS
2 IN_ANALYSIS
3 APPROVED
3 APPROVED
3 CONTRACTED
我想按user_id
合並數據幀行,因此,如果用戶至少有一個請求已批准或已收縮,則結果狀態必須為已批准,否則必須為已被拒絕。 例如,對於上面的數據,結果數據框應如下所示:
user_id status
1 APPROVED
2 DISAPPROVED
3 APPROVED
這是一種方法:
import pandas as pd
df2 = df.groupby('user_id')['status'].apply(list)\
.apply(lambda x: 'APPROVED' if any(i in x for i in ['APPROVED', 'CONTRACTED']) else 'DISAPPROVED')\
.reset_index()
# user_id status
# 0 1 APPROVED
# 1 2 DISAPPROVED
# 2 3 APPROVED
按用戶分組,然后匯總其結果列表。 然后根據您創建的一些自定義邏輯定義一個函數來檢查狀態。 最后,使用map函數將邏輯應用於列並創建一個new_col,然后您可以根據需要使用它。 不如一個內膽優雅,但也許可以解釋。
import pandas as pd
df = pd.read_clipboard()
df = df.groupby('user_id')['status'].apply(lambda x: "%s" % ', '.join(x).split()).reset_index()
def logic(row):
if 'APPROVED' in row or 'CONTRACTED' in row:
return 'APPROVED'
else:
return 'DISAPPROVED'
df['new_col'] = df.status.map(logic)
df.head()
user_id status new_col
0 1 ['IN_ANALYSIS,', 'APPROVED,', 'DISAPPROVED'] APPROVED
1 2 ['IN_ANALYSIS,', 'IN_ANALYSIS'] DISAPPROVED
2 3 ['APPROVED,', 'APPROVED,', 'CONTRACTED'] APPROVED
設置OP定義的參數
a_status = ['APPROVED', 'CONTRACTED']
mapping = {True: 'APPROVED', False: 'DISAPPROVED'}
使用isin
, groupby
和map
df.status.isin(a_status).groupby(df.user_id).any().map(mapping).reset_index()
user_id status
0 1 APPROVED
1 2 DISAPPROVED
2 3 APPROVED
說明
groupby
和any
查看是否滿足真實條件。 APPROVED
/已DISAPPROVED
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.