程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

根据多个条件将值复制到下一行,无需 for 循环[重复]

发布于2023-10-27 22:56     阅读(1950)     评论(0)     点赞(3)     收藏(2)


我有一个包含 3 列的数据框。大多数情况下,C 列是空的。当 A 列中的值不等于上一行 A 列中的值时,每个实例只有一个值。例如:

A     B             C
123   10-11-2023    100
123   10-11-2023
123   19-11-2023
123   27-11-2023
456   08-12-2023    80
456   10-12-2023
456   14-12-2023
789   28-10-2023    130
789   28-10-2023
789   28-10-2023
789   03-11-2023

现在我想将 C 列中的值复制到 A 列和 B 列中的值等于 C 列不为空的行的 A 列和 B 列中的值的所有行。那么结果应该是:

A     B             C
123   10-11-2023    100
123   10-11-2023    100
123   19-11-2023
123   27-11-2023
456   08-12-2023    80
456   10-12-2023
456   14-12-2023
789   28-10-2023    130
789   28-10-2023    130
789   28-10-2023    130
789   03-11-2023

目前我将其作为 for 循环:

non_empty_C = df0['C'].dropna()

for index, value in non_empty_C.iteritems():
    match_A = df0.loc[index, 'A']
    match_B = df0.loc[index, 'B']
    mask_match = (df0['A'] == match_A) & (df0['B'] == match_B)
    df0.loc[mask_match, 'C'] = df0['C'].ffill()

这是可行的,但由于我有一个最多 100 万行的数据帧,所以速度太慢了。我尝试将其重写为向量化操作,但我不完全知道如何执行此操作,因为我有两个条件并将值与前一行进行比较的复杂性。有什么建议么?


解决方案


实际上,您可以在不使用任何循环的情况下实现此目的。关键是要利用提供的groupby和方法这些函数使得将函数应用于每组值变得非常容易,在您的情况下,用每组中的第一个可用值填充缺失值transformpandas'C'('A', 'B')

import pandas as pd

data = {'A': [123, 123, 123, 123, 456, 456, 456, 789, 789, 789, 789],
        'B': ['10-11-2023', '10-11-2023', '19-11-2023', '27-11-2023', '08-12-2023', '10-12-2023', '14-12-2023', '28-10-2023', '28-10-2023', '28-10-2023', '03-11-2023'],
        'C': [100, None, None, None, 80, None, None, 130, None, None, None]}

df = pd.DataFrame(data)

# Vectorized operation to fill missing values in C based on the first value in each (A, B) group
df['C'] = df.groupby(['A', 'B'])['C'].transform('first')

print(df)


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/2034792/78171385acbc11a6871b/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

3 0
收藏该文
已收藏

评论内容:(最多支持255个字符)