在数据框字典中合并数据框
Posted
技术标签:
【中文标题】在数据框字典中合并数据框【英文标题】:Merge dataframes inside a dictionary of dataframes 【发布时间】:2020-12-23 00:31:46 【问题描述】:我有一个字典 dict
的数据框,例如:
‘table_1’: name color type
Banana Yellow Fruit,
‘another_table_1’: city state country
Atlanta Georgia United States,
‘and_another_table_1’: firstname middlename lastname
John Patrick Snow,
‘table_2’: name color type
Red Apple Fruit,
‘another_table_2’: city state country
Arlington Virginia United States,
‘and_another_table_2’: firstname middlename lastname
Alex Justin Brown,
‘table_3’: name color type
Lettuce Green Vegetable,
‘another_table_3’: city state country
Dallas Texas United States,
‘and_another_table_3’: firstname middlename lastname
Michael Alex Smith
我想根据它们的名称将这些数据框合并在一起,这样最终我将只有 3 个数据框:
table
name color type
Banana Yellow Fruit
Red Apple Fruit
Lettuce Green Vegetable
another_table
city state country
Atlanta Georgia United States
Arlington Virginia United States
Dallas Texas United States
and_another_table
firstname middlename lastname
John Patrick Snow
Alex Justin Brown
Michael Alex Smith
根据我最初的研究,Python 似乎应该可以做到这一点:
-
通过使用
.split
、字典理解和itertools.groupby
根据键名将字典内的数据帧组合在一起
使用这些分组结果创建字典字典
使用 pandas.concat
函数循环遍历这些字典并将数据帧组合在一起
我在 Python 方面没有太多经验,我对如何实际编写代码有点迷茫。
我已经复习了 How to group similar items in a list? 和 Merge dataframes in a dictionary 帖子,但它们没有那么有用,因为在我的情况下,数据帧的名称长度会有所不同。
另外,我不想硬编码任何数据框名称,因为它们有超过 1000 个。
【问题讨论】:
dict 键是否有一个命名约定,可以清楚地看出它们属于哪个最终表,就像在示例中一样,您可以在其中使用最终'_'
之前的所有内容?
字典键除了最后一个数字“_1”或“_2”外有通用名称。所以“table_1”、“table_2”和“table_3”将有共同的名字“table”。
【参考方案1】:
这是一种方法:
给出这个数据框字典:
dd = 'table_1': pd.DataFrame('Name':['Banana'], 'color':['Yellow'], 'type':'Fruit'),
'table_2': pd.DataFrame('Name':['Apple'], 'color':['Red'], 'type':'Fruit'),
'another_table_1':pd.DataFrame('city':['Atlanta'],'state':['Georgia'], 'Country':['United States']),
'another_table_2':pd.DataFrame('city':['Arlinton'],'state':['Virginia'], 'Country':['United States']),
'and_another_table_1':pd.DataFrame('firstname':['John'], 'middlename':['Patrick'], 'lastnme':['Snow']),
'and_another_table_2':pd.DataFrame('firstname':['Alex'], 'middlename':['Justin'], 'lastnme':['Brown']),
tables = set([i.rsplit('_', 1)[0] for i in dd.keys()])
dict_of_dfs = i:pd.concat([dd[x] for x in dd.keys() if x.startswith(i)]) for i in tables
输出一个新的组合表字典:
dict_of_dfs['table']
# Name color type
# 0 Banana Yellow Fruit
# 0 Apple Red Fruit
dict_of_dfs['another_table']
# city state Country
# 0 Atlanta Georgia United States
# 0 Arlinton Virginia United States
dict_of_dfs['and_another_table']
# firstname middlename lastnme
# 0 John Patrick Snow
# 0 Alex Justin Brown
使用集合中的 defaultdict 的另一种方法,创建组合数据框的列表:
from collections import defaultdict
import pandas as pd
dd = 'table_1': pd.DataFrame('Name':['Banana'], 'color':['Yellow'], 'type':'Fruit'),
'table_2': pd.DataFrame('Name':['Apple'], 'color':['Red'], 'type':'Fruit'),
'another_table_1':pd.DataFrame('city':['Atlanta'],'state':['Georgia'], 'Country':['United States']),
'another_table_2':pd.DataFrame('city':['Arlinton'],'state':['Virginia'], 'Country':['United States']),
'and_another_table_1':pd.DataFrame('firstname':['John'], 'middlename':['Patrick'], 'lastnme':['Snow']),
'and_another_table_2':pd.DataFrame('firstname':['Alex'], 'middlename':['Justin'], 'lastnme':['Brown']),
tables = set([i.rsplit('_', 1)[0] for i in dd.keys()])
d = defaultdict(list)
[d[i].append(dd[k]) for i in tables for k in dd.keys() if k.startswith(i)]
l_of_dfs = [pd.concat(d[i]) for i in d.keys()]
print(l_of_dfs[0])
print('\n')
print(l_of_dfs[1])
print('\n')
print(l_of_dfs[2])
输出:
city state Country
0 Atlanta Georgia United States
0 Arlinton Virginia United States
firstname middlename lastnme
0 John Patrick Snow
0 Alex Justin Brown
Name color type
0 Banana Yellow Fruit
0 Apple Red Fruit
【讨论】:
以上是关于在数据框字典中合并数据框的主要内容,如果未能解决你的问题,请参考以下文章