我有两个单独的列表,每个列表包含n个元素,一个是ID号,另一个是Pandas 数据帧.我将它们定义为iddfs.dfs中的数据帧具有与列ABC相同的格式,但具有不同的数值.我已经把这两份 list 压缩在一起了:

df_groups = list(zip(id, dfs))

在这个列表中,我试图找到id相同的任何实例,然后为这些嵌套框添加列AB并合并为一个嵌套框.例如,我将使用以下代码:

id = ['a','b','c','a','d']

我拥有的相应数据帧可能如下所示:

dfs[0]
A  B  C
0  0  1
0  0  1

dfs[1]
A  B  C
0  1  1
0  1  1

dfs[2]
A  B  C
1  1  1
1  2  1

dfs[3]
A  B  C
5  6  1
11 8  1

dfs[4]
A  B  C
3  5  2
3  18 2

从上面可以看出,id[0]id[3]是一样的.因此,我想创建一个新的元组列表,将dfs[0]['A']dfs[3]['A']相加(列B也是如此,删除重复的id值.

因此,它应该看起来像这样:

id = ['a','b','c','d']

dfs[0]
A  B  C
5  6  1
11 8  1

dfs[1]
A  B  C
0  1  1
0  1  1

dfs[2]
A  B  C
1  1  1
1  2  1

dfs[3]
A  B  C
3  5  2
3  18 2

下面的方法可以删除重复的值id,但我不太确定如何对dfs进行列操作.当然,在运行以下代码之前,我需要首先添加列AB:

from itertools import groupby

df_groups_b = ([next(b) for a, b in groupby(df_groups, lambda x: x[0])])

任何帮助都将不胜感激,谢谢!

编辑:为澄清起见,原始数据框中的C列将保持不变.在第一个元组元素匹配的情况下,来自相应数据帧的列C将相同.

推荐答案

你可以编写一个自定义的汇总函数来遍历一个组中的所有子帧并返回一个总和.

我并不完全喜欢这个解决方案,因为在将C转换为浮点型时,如果需要,您可以进一步使用它:

from itertools import groupby
import pandas as pd

ids = ['a','b','c','a','d']
dfs = [
    pd.DataFrame({"A": [0], "B": [0], "C": [0]}),
    pd.DataFrame({"A": [1], "B": [1], "C": [1]}),
    pd.DataFrame({"A": [2], "B": [2], "C": [2]}),
    pd.DataFrame({"A": [3], "B": [3], "C": [3]}),
    pd.DataFrame({"A": [4], "B": [4], "C": [4]})
]
df_groups = list(zip(ids, dfs))
df_groups = sorted(df_groups, key=lambda x: x[0])
def summarise_cols(group, cols_to_summarise=["A", "B"]):
    _, df = next(group)
    for _, next_df in group:
        df = df.add(next_df[cols_to_summarise], fill_value=0)
    return df

df_groups_b = ([summarise_cols(group)
                for _, group in groupby(df_groups, lambda x: x[0])])

for d in df_groups_b:
    print(d)

输出:

   A  B    C
0  3  3  0.0
   A  B  C
0  1  1  1
   A  B  C
0  2  2  2
   A  B  C
0  4  4  4

UPD:刚刚注意到你的更新

编辑:为澄清起见,原始数据框中的C列将保持不变.在第一个元组元素匹配的情况下,来自相应数据帧的列C将相同.

然后,您可以执行此操作,列类型将保持不变

def summarise_cols(group, cols_to_keep=["C"]):
    _, df = next(group)
    for _, next_df in group:
        df += next_df
        df[cols_to_keep] = next_df[cols_to_keep]
    return df

UPD2:将group_id和统一数据帧一起作为元组返回.

def summarise_cols(group, cols_to_keep=["C"]):
    group_id, df = next(group)
    for _, next_df in group:
        df += next_df
        df[cols_to_keep] = next_df[cols_to_keep]
    return group_id, df

Python相关问答推荐

替换字符串中的多个重叠子字符串

Odoo 14 hr. emergency.public内的二进制字段

如何比较numPy数组中的两个图像以获取它们不同的像素

将整组数组拆分为最小值与最大值之和的子数组

Mistral模型为不同的输入文本生成相同的嵌入

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

如何在Python中并行化以下搜索?

对所有子图应用相同的轴格式

如何从pandas的rame类继承并使用filepath实例化

如何设置视频语言时上传到YouTube与Python API客户端

Pandas Data Wrangling/Dataframe Assignment

在Python中使用if else或使用regex将二进制数据如111转换为001""

python sklearn ValueError:使用序列设置数组元素

如何在GEKKO中使用复共轭物

如何在Gekko中处理跨矢量优化

Django.core.exceptions.SynchronousOnlyOperation您不能从异步上下文中调用它-请使用线程或SYNC_TO_ASYNC

try 在单个WITH_COLUMNS_SEQ操作中链接表达式时,使用Polars数据帧时出现ComputeError

大Pandas 中的群体交叉融合

有什么方法可以在不对多索引DataFrame的列进行排序的情况下避免词法排序警告吗?

如何使用count()获取特定日期之间的项目