首页 > 解决方案 > 在 Pandas 中将列一分为二的简单方法

问题描述

我有一个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

如果值分别为正或负,我想将金额列拆分为Invoiced和。Reimbursed

我目前正在这样做:

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

但是,在 Pandas 中没有更简单的方法吗?

标签: pythonpandas

解决方案


你可以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

推荐阅读