Python Pandas:按条件传递用户数值(替换来源B数据)的实现问询
Pandas按用户分组实现数值传递操作
要实现你需要的逻辑,可按以下步骤操作:
- 先将
Value列转换为数值类型(示例中该列为字符串,避免后续运算出错) - 按
USER分组,生成每组内上一行的Value - 通过条件判断完成替换:仅当
Source为B且当前行不是用户组内首行时,用上一行Value替换,其余情况保留原值
完整代码示例
import pandas as pd import numpy as np # 初始化数据 df = pd.DataFrame({ "USER": ["USER1", "USER1", "USER1", "USER1", "USER1", "USER2", "USER2", "USER2", "USER2", "USER2"], "Date": ["01/01/2023", "01/02/2023", "02/02/2023", "20/02/2023", "01/07/2023", "01/01/2023", "01/02/2023", "02/02/2023", "20/02/2023", "01/07/2023"], "Value": ["1000", "1200", "1300", "1000", "1400", "1000", "1200", "1250", "1300", "1400"], "Source": ["A", "A", "A", "B", "A", "A", "A", "B", "A", "A"] }) # 转换Value为数值类型 df['Value'] = df['Value'].astype(int) # 按用户分组,获取上一行的Value df['prev_value'] = df.groupby('USER')['Value'].shift(1) # 条件替换Value df['Value'] = np.where( (df['Source'] == 'B') & df['prev_value'].notna(), df['prev_value'], df['Value'] ) # 删除临时列 df = df.drop('prev_value', axis=1) # 查看结果 print(df)
运行结果
| USER | Date | Value | Source |
|---|---|---|---|
| USER1 | 01/01/2023 | 1000 | A |
| USER1 | 01/02/2023 | 1200 | A |
| USER1 | 02/02/2023 | 1300 | A |
| USER1 | 20/02/2023 | 1300 | B |
| USER1 | 01/07/2023 | 1400 | A |
| USER2 | 01/01/2023 | 1000 | A |
| USER2 | 01/02/2023 | 1200 | A |
| USER2 | 02/02/2023 | 1200 | B |
| USER2 | 20/02/2023 | 1300 | A |
| USER2 | 01/07/2023 | 1400 | A |
完全匹配你给出的目标数据要求。
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

