如何不使用for循环对Pandas中同日期同值行的指定字段求和
高效实现Pandas分组计算需求
需求说明
针对给定的DataFrame,需要对**相同date和value**的分组,提取name2=1对应的buy_price,与name2=2对应的sell_price相加,最终输出x+y格式的字符串。
高效实现方案
避免使用Python循环,利用Pandas的向量式操作处理,大幅提升大数据集下的运行效率,以下提供两种可行方案:
方案1:使用透视表(pivot_table)
通过透视表直接按分组维度聚合所需字段,再生成结果字符串:
import pandas as pd # 构造示例DataFrame data = { 'name': ['a', 'f', 'd', 'b', 'e', 'd'], 'name2': [1, 2, 1, 2, 1, 2], 'date': ['2-2-24', '2-2-24', '3-3-24', '3-3-24', '4-3-24', '4-3-24'], 'value': [100, 100, 200, 200, 300, 300], 'buy_price': [1, 2, 9, 5, 2, 5], 'sell_price': [3, 4, 2, 7, 1, 6] } df = pd.DataFrame(data) # 生成透视表,按date、value分组,提取对应字段 pivot_df = df.pivot_table( index=['date', 'value'], columns='name2', values={'buy_price': 'first', 'sell_price': 'first'} ).reset_index() # 提取目标字段并生成结果字符串 buy_col = pivot_df[('buy_price', 1)] sell_col = pivot_df[('sell_price', 2)] result = buy_col.astype(str) + '+' + sell_col.astype(str) # 输出结果 for line in result: print(line)
方案2:拆分合并子集
将name2=1和name2=2的行拆分为两个子集,按date和value合并后计算:
import pandas as pd # 构造示例DataFrame(同方案1) data = { 'name': ['a', 'f', 'd', 'b', 'e', 'd'], 'name2': [1, 2, 1, 2, 1, 2], 'date': ['2-2-24', '2-2-24', '3-3-24', '3-3-24', '4-3-24', '4-3-24'], 'value': [100, 100, 200, 200, 300, 300], 'buy_price': [1, 2, 9, 5, 2, 5], 'sell_price': [3, 4, 2, 7, 1, 6] } df = pd.DataFrame(data) # 拆分出两个目标子集 df_name2_1 = df[df['name2'] == 1][['date', 'value', 'buy_price']] df_name2_2 = df[df['name2'] == 2][['date', 'value', 'sell_price']] # 按date和value合并子集 merged_df = pd.merge(df_name2_1, df_name2_2, on=['date', 'value']) # 生成结果字符串并输出 result = merged_df['buy_price'].astype(str) + '+' + merged_df['sell_price'].astype(str) for line in result: print(line)
效率说明
两种方案均采用Pandas内置的向量式运算,底层基于C实现,避免了Python层面的循环开销,在大数据集下的运行效率远高于手动循环。
内容的提问来源于stack exchange,提问作者mona
相关产品推荐
相关产品推荐

