Python 根据另一个数据帧中的匹配行将部分行移动到上一行

标签 python pandas

我有两个数据框df1:

    Name Month  Amount  Status
0   Bill   Apr       0           
1   Bill   May       0           
2   Bill   Jun     100  member
3  Sally   Apr       0           
4  Sally   May       0           
5  Sally   Jun     200  member
6    Tom   Apr       0           
7    Tom   May     300  member
8    Tom   Jun       0           

df2:

   Name Month
0  Bill   Jun
1   Tom   May

只要 df2 中的名称和月份匹配,我就会更新 df1,并将金额和状态移至上个月。可以假设每个人总是有一个上个月要移动到,并且行已经按姓名和月份按正确的顺序排列。预期结果如下:

    Name Month  Amount  Status
0   Bill   Apr       0           
1   Bill   May     100  member           
2   Bill   Jun       0
3  Sally   Apr       0           
4  Sally   May       0           
5  Sally   Jun     200  member
6    Tom   Apr     300  member          
7    Tom   May       0
8    Tom   Jun       0           

我相信有一种方法可以使用 itterows() 来做到这一点,但是这里有更直接的方法吗?

最佳答案

尝试:

# merge to find rows with Name, Month in df2
exist = df1[['Name','Month']].merge(df2.assign(exist=1), how='left')['exist'].notna()

# find the previous rows
prev_rows = exist.groupby(df1['Name']).shift(-1, fill_value=False)

# fill the previous rows
df1.loc[prev_rows, ['Amount','Status']] = df1.loc[exist, ['Amount','Status']].to_numpy()

# remove the given rows
df1.loc[exist, ['Amount','Status']] = [0, None]

输出:

    Name Month  Amount  Status
0   Bill   Apr       0    None
1   Bill   May     100  member
2   Bill   Jun       0    None
3  Sally   Apr       0    None
4  Sally   May       0    None
5  Sally   Jun     200  member
6    Tom   Apr     300  member
7    Tom   May       0    None
8    Tom   Jun       0    None

关于Python 根据另一个数据帧中的匹配行将部分行移动到上一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76843614/

相关文章:

python - 在 matplotlib 中更改循环仪顺序

python - 在 pygame 中加载透明背景 Sprite 时出现问题

python - Django get_queryset 过滤 pk 上的对象

python - 根据多个标识符查找值的中位数并添加到行

python - 从时间序列中删除特定日期(2 月 29 日)的最有效方法

javascript - scrapy-splash 用于渲染 javascript

python - Django 或 Python,如何将 postscript 转换为 PDF 或图像

python - 如果特定的其他列不为空,如何删除重复项但保留行(Pandas)

pandas - 使用多索引处理日期索引时遇到问题

python - 每日最长连续条纹的矢量化计数