如何根据 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、保留空值,或者为这些类型单独创建新列。
备注:内容仅供参考。
