如何在字典中连接数据帧

问题描述 投票:0回答:4

我有一本大小为8的字典, 每个键(h3-h10)都有一个数据帧作为值。

我想对所有数据帧进行多次 pd.concat 。 我确实用简单的 pd.concat 合并了 2 个数据帧,但我不知道如何迭代所有数据帧

df=pd.concat([data['h3'][0],data['h4'][0]])
print(df)

它给出了这个 output

我的第一个想法是创建空数据帧,然后使用 for 循环,附加所有其余的数据帧 我有 h3-h10 作为数据框

qhn = []
i=0
for k in data:
  for i in range (0:len(data)-1):
    qhn = pd.concat([qhn,data[f'h{i}}'][0]])
    i+=1
print(qhn)

编辑:

我正在考虑在 for 循环的帮助下创建一系列数据框, 然后执行 pd.concate(series):

for k in data:
  ser.set_value(data[f'{k}'][0])
print(Series)

但它也给了我错误:

AttributeError:“Series”对象没有属性“set_value”

python pandas dataframe merge concatenation
4个回答
2
投票

您可以使用

dict.values
连接所有值来一次调用所有值:

out = pd.concat(data.values(), ignore_index=True)

但是,似乎

data.values()
包含 DataFrame 列表,在这种情况下,您可以使用生成器表达式展平列表,然后连接:

out = pd.concat((df for lst in data.values() for df in lst), ignore_index=True)

data
看起来像:

data = {'h3': [df3], 'h4': [df4], ..., 'h10': [df10]}

其中每个

df3, df4, ... df10
都是一个 DataFrame。然后,由于
data.values()
是一个显示其中所有值的列表的对象,因此它是 DataFrame 列表的列表。但是,
pd.concat
仅适用于Series或DataFrame对象,因此您需要创建单个DataFrame列表,而不是DataFrame列表列表。所以你使用生成器表达式将其展平:

(df for lst in data.values() for df in lst)

并将其传递给

pd.concat
进行连接。


0
投票

也许您可以使用

data.values()
来获取所有数据帧的列表:

qhn = pd.concat(data.values())

0
投票

可能有两种情况来存储这个基础

data

场景 1:将 DataFrame 直接存储为字典中的值:

data1 = {'h1':df1, 'h2':df2, 'h3':df3...}

在这种情况下,您可以简单地扩展通过第一次迭代创建第一个数据框的逻辑,然后在遍历值并使用 .append 时继续附加

value
,如下所示:

data1 = {'h1':df1,'h2':df2,'h3':df3}

counter = 0
for value in data1.values():
    if counter == 0:
        output = value
        counter = 1
    else:
        output = output.append(value)

场景 2:将 DataFrame 名称存储在字典列表中的位置:

data2 = {'h1':[df1],'h2':[df2],'h3':[df3] ...}

在这里,您可以再次扩展上述相同的逻辑,但使用索引 [0] 访问 value,从而创建第一个数据框,然后通过遍历 value[0] 并使用

.append
继续附加进一步的迭代像这样:

data2 = {'h1':[df1],'h2':[df2],'h3':[df3]}

counter = 0
for value in data2.values():
    if counter == 0:
        output = value[0]
        counter = 1
    else:
        output = output.append(value[0])

0
投票
# Here's the easiest way to concat dataframes stored in a dictionary.
pd.concat([v for k, v in data.items()], ignore_index=True).reset_index(drop=True)

# One might want to keep the key value:
df = pd.DataFrame()
for k, v in data.items():
    v["key"] = k
    df = pd.concat([df, v], ignore_index=True)
df
© www.soinside.com 2019 - 2024. All rights reserved.