简单的方法分裂成两列在Pandas

2024-06-28 18:46:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我在熊猫身上有一个DataFrame,看起来像这样:

transactions_df = pd.DataFrame({'Date': ['2019-08-01', '2019-09-01', '2019-10-01'], 'Amount': [150, -25, 200]})
transactions_df.head()
Date        Amount
2019-08-01  150
2019-09-01  -25
2019-10-01  200

我想将amount列拆分为InvoicedReimbursed,如果值分别为正或负

我现在是这样做的:

def split_trans_amount(row):
    invoiced = row['Amount'] if row['Amount'] > 0 else 0
    reimbursed = row['Amount'] if row['Amount'] < 0 else 0

    return pd.Series([invoiced, reimbursed], index=['Invoiced', 'Reimbursed'])

transactions_in_out_df = transactions_df.apply(lambda x: split_trans_amount(x), axis=1)
transactions_split_df = pd.concat([transactions_df, transactions_in_out_df], axis=1)
transactions_split_df.head()

它给了我所需要的:

Date        Amount      Invoiced    Reimbursed
2019-08-01  150         150         0
2019-09-01  -25         0           -25
2019-10-01  200         200         0

但是,难道没有一种更简单的方法可以在熊猫身上做到这一点吗


Tags: dataframedftransdateifamountheadrow
2条回答

您可以在这里使用np.clip(..)

transactions_df['Invoiced'] = transactions_df['Amount'].values.clip(min=0)
transactions_df['Reimbursed'] = transactions_df['Amount'].values.clip(max=0)

这给了我们:

>>> transactions_df
         Date  Amount  Invoiced  Reimbursed
0  2019-08-01     150       150           0
1  2019-09-01     -25         0         -25
2  2019-10-01     200       200           0
transactions_df['Invoiced'] = transactions_df['Amount'].multiply(transactions_df['Amount']>0)
transactions_df['Reimbursed'] = transactions_df['Amount'].multiply(transactions_df['Amount']<0)

同样有效

         Date  Amount  Invoiced  Reimbursed
0  2019-08-01     150       150           0
1  2019-09-01     -25         0         -25
2  2019-10-01     200       200           0

相关问题 更多 >