簡體   English   中英

如何在熊貓中合並具有不同值的數據框行

[英]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'}

使用isingroupbymap

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

說明

  • 評估每一行的真實性。
  • 使用groupbyany查看是否滿足真實條件。
  • 將真相映射回已APPROVED /已DISAPPROVED

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM