PAYATHON 2026

如何根据 comments 将 Payment 拆分为两列?

支付老李

结论

使用 pandas 时,如果需要保留原有行,可以根据 comments 的值分别给新列赋值:comments 为 refund 时,将 Payment 写入 refund 列;为 transfer fee 时,将金额写入 transfer_fee 列;其他位置保留为空值。

import pandas as pd

df = pd.DataFrame({
    "Payment": [3000, 3000, 3000],
    "comments": ["refund", "refund", "transfer fee"]
})

df["refund"] = df["Payment"].where(df["comments"].eq("refund"))
df["transfer_fee"] = df["Payment"].where(
    df["comments"].eq("transfer fee")
)

result = df.drop(columns="Payment")
print(result)

输出结果:

       comments  refund  transfer_fee
0        refund  3000.0           NaN
1        refund  3000.0           NaN
2  transfer fee     NaN        3000.0

为什么使用 where

Series.where() 会保留符合条件的值,并把其他位置设为 NaN。下面这行代码:

df["Payment"].where(df["comments"].eq("refund"))

表示:

  • 当 comments == "refund" 时,保留对应的 Payment
  • 其他位置填入 NaN

这种写法不会合并或删除记录,所以两个 refund 行都会保留下来。

如果不需要保留 comments 列

如果只想得到拆分后的两列,可以直接创建一个新的 DataFrame:

result = pd.DataFrame({
    "refund": df["Payment"].where(df["comments"].eq("refund")),
    "transfer_fee": df["Payment"].where(
        df["comments"].eq("transfer fee")
    )
})

print(result)

输出结果:

   refund  transfer_fee
0  3000.0           NaN
1  3000.0           NaN
2     NaN        3000.0

如果希望空值显示为 0

拆分后调用 fillna(0) 即可:

result = pd.DataFrame({
    "refund": df["Payment"].where(df["comments"].eq("refund")),
    "transfer_fee": df["Payment"].where(
        df["comments"].eq("transfer fee")
    )
}).fillna(0)

如果 Payment 原本是整数,并且结果也需要保持整数类型,可以继续转换:

result = result.astype(int)

输出结果:

   refund  transfer_fee
0    3000             0
1    3000             0
2       0          3000

注意事项

comments 中的文本需要与判断条件完全一致。大小写不同、前后有空格或存在拼写差异,都会导致匹配失败。如果数据不够规范,可以先清理文本:

comments = df["comments"].str.strip().str.lower()

df["refund"] = df["Payment"].where(comments.eq("refund"))
df["transfer_fee"] = df["Payment"].where(
    comments.eq("transfer fee")
)

如果 comments 中还有其他类型,对应行的两个新列都会是 NaN。可以根据后续统计需求,选择填入 0、保留空值,或者为这些类型单独创建新列。

备注:内容仅供参考。