发布于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
和方法。这些函数使得将函数应用于每组值变得非常容易,在您的情况下,用每组中的第一个可用值填充缺失值。transform
pandas
'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黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!