在python中循环遍历数据框字典并将字典中的每个数据框与单个数据框合并
Posted
技术标签:
【中文标题】在python中循环遍历数据框字典并将字典中的每个数据框与单个数据框合并【英文标题】:Loop through dictionary of dataframes and merge each dataframe in dictionary with a single dataframe, in python 【发布时间】:2021-08-03 05:55:46 【问题描述】:我有一个数据框字典,我想将所述字典中的每个数据框与不在该字典中的单个数据框合并。之后,我希望合并的数据帧重写字典中的数据帧。
所以我有一个包含 200 多个不同数据帧的字典:
dictionary = 'df1' : df1 .... 'df200' : df200
其中字典中的每个数据框如下所示:
DATE | Individual | Location | Money_Spent |
---|---|---|---|
2010-05-22 | 1 | Seattle | 10000 |
2021-01-04 | 1 | Chicago | 30000 |
2012-06-30 | 1 | Seattle | 10000 |
2021-10-22 | 1 | Los Angeles | 30000 |
2010-06-13 | 1 | Seattle | 10000 |
2021-03-04 | 1 | Chicago | 30000 |
哪个是个人 1 的数据框 df1。字典中的 df2 是针对个人 2 的,并且具有相同的信息,但针对个人 2:
DATE | Individual | Location | Money_Spent |
---|---|---|---|
2012-05-02 | 2 | Atlanta | 50000 |
2009-01-14 | 2 | Chicago | 30000 |
2004-06-20 | 2 | Atlanta | 60000 |
2009-10-12 | 2 | Los Angeles | 80000 |
2017-07-23 | 2 | New York | 90000 |
2018-04-14 | 2 | Chicago | 100000 |
200 个人以此类推。
我想将字典中的每个 df 与字典外部的另一个数据框合并,如下所示:
DATE | Location | CUMSUM Money Spent |
---|---|---|
2012-06-30 | Atlanta | 10000000 |
2009-09-30 | Atlanta | 30000000 |
2020-06-30 | Atlanta | 55000000 |
2013-03-31 | Chicago | 670999999 |
2013-12-31 | New york | 600000 |
2018-03-31 | New york | 6500000 |
2013-12-31 | Los Angeles | 2300000 |
2018-03-31 | Los Angeles | 567000 |
此数据框包含每个季度在每个位置花费的累计金额。我想将字典中的每个数据框与包含累计支出金额信息的数据框合并。我想在“位置”上合并这个数据框。因此字典中的每个数据框都应该有 N 行,其中包含有关一天花费的钱的信息,其中 N 是给定城市每个季度的观察次数。
例如,与个人 2 相关的数据框有两个与亚特兰大一天花费的钱相关的观察值,而具有累计花费的数据框有 3 个观察值。所以合并的数据框应该有 6 行与亚特兰大位置相关。最终数据框应如下所示:
DATE_x | Individuaial | Location | Money_Speny | Date_y | CUMSUM Money Spent |
---|---|---|---|---|---|
2012-05-02 | 2 | Atlanta | 50000 | 2012-06-30 | 10000000 |
2012-05-02 | 2 | Atlanta | 50000 | 2009-09-30 | 30000000 |
2012-05-02 | 2 | Atlanta | 50000 | 2020-06-30 | 55000000 |
2004-06-20 | 2 | Atlanta | 60000 | 2012-06-30 | 10000000 |
2004-06-20 | 2 | Atlanta | 60000 | 2009-09-30 | 30000000 |
2004-06-20 | 2 | Atlanta | 60000 | 2020-06-30 | 55000000 |
2009-01-14 | 2 | Chicago | 30000 | 2013-03-31 | 670999999 |
2012-05-02 | 2 | Chicago | 50000 | 2013-03-31 | 670999999 |
2009-10-12 | 2 | Los Angeles | 80000 | 2013-12-31 | 2300000 |
2009-10-12 | 2 | Los Angeles | 80000 | 2018-03-31 | 567000 |
2017-07-23 | 2 | New york | 90000 | 2013-12-31 | 600000 |
2017-07-23 | 2 | New york | 90000 | 2018-03-31 | 6500000 |
对于字典中的每个数据框,我希望这个新数据框替换字典中的数据框。
我试过for key, df in dict_df.items(): df = pd.merge(df, cumsum, on = 'Individual', how = 'right')
但它说“TypeError: Can only merge Series or DataFrame objects, a
谢谢。
【问题讨论】:
如何读取所有这些数据帧?为什么有这么多单独的数据框?例如,如果您读入的每个人都有 200 个文件,那么您可能会采用完全不同的解决方案。 IE。是否对这么多数据帧 VS 有特殊需求。一个数据框,其中有一列可以区分个体。 我确实有一个可以区分个体的数据框,实际上我使用该数据框创建了字典。我有很多不同的数据框,因为我需要根据个人和城市创建报告。我已经创建了一个基于城市创建此报告的函数,但现在我想为每个城市中的每个人创建此报告,并为每个城市和个人的组合创建一个不同的报告。最终产品应该只是数据框中的一行,但我需要先转换字典中的每个数据框,以便应用我定义的函数。 你能分享你所有的代码吗?我可能有一个想法。 @tipatito 那么为什么不这样做before
拆分成多个数据帧。这样会更有效率
您可以直接使用大数据框。您可能需要检查合并文档:根据您的示例和文档,它会想做:bigdf.merge(cumsumdf, how='left', on='Location')
【参考方案1】:
在我的回答中,df1
是整个数据框在您分成 200 个数据框之前。您所要做的就是与另一个数据框dropna
合并并根据需要进行排序。从那里,您可以拆分为多个数据框:
df1.merge(df2, on='Location').dropna().sort_values(['Individual', 'Location', 'DATE_x', 'CUMSUM Money Spent'])
输入:
df1 = pd.DataFrame('DATE': 0: '2010-05-22',
1: '2021-01-04',
2: '2012-06-30',
3: '2021-10-22',
4: '2010-06-13',
5: '2021-03-04',
6: '2012-05-02',
7: '2009-01-14',
8: '2004-06-20',
9: '2009-10-12',
10: '2017-07-23',
11: '2018-04-14',
'Individual': 0: 1,
1: 1,
2: 1,
3: 1,
4: 1,
5: 1,
6: 2,
7: 2,
8: 2,
9: 2,
10: 2,
11: 2,
'Location': 0: 'Seattle',
1: 'Chicago',
2: 'Seattle',
3: 'Los Angeles',
4: 'Seattle',
5: 'Chicago',
6: 'Atlanta',
7: 'Chicago',
8: 'Atlanta',
9: 'Los Angeles',
10: 'New York',
11: 'Chicago',
'Money_Spent': 0: 10000,
1: 30000,
2: 10000,
3: 30000,
4: 10000,
5: 30000,
6: 50000,
7: 30000,
8: 60000,
9: 80000,
10: 90000,
11: 100000)
df1
df2 = pd.DataFrame('DATE': 0: '2012-06-30',
1: '2009-09-30',
2: '2020-06-30',
3: '2013-03-31',
4: '2013-12-31',
5: '2018-03-31',
6: '2013-12-31',
7: '2018-03-31',
'Location': 0: 'Atlanta',
1: 'Atlanta',
2: 'Atlanta',
3: 'Chicago',
4: 'New york',
5: 'New york',
6: 'Los Angeles',
7: 'Los Angeles',
'CUMSUM Money Spent': 0: 10000000,
1: 30000000,
2: 55000000,
3: 670999999,
4: 600000,
5: 6500000,
6: 2300000,
7: 567000)
df2
输出:
Out[35]:
DATE_x Individual Location Money_Spent DATE_y \
0 2021-01-04 1 Chicago 30000 2013-03-31
1 2021-03-04 1 Chicago 30000 2013-03-31
5 2021-10-22 1 Los Angeles 30000 2018-03-31
4 2021-10-22 1 Los Angeles 30000 2013-12-31
11 2004-06-20 2 Atlanta 60000 2012-06-30
12 2004-06-20 2 Atlanta 60000 2009-09-30
13 2004-06-20 2 Atlanta 60000 2020-06-30
8 2012-05-02 2 Atlanta 50000 2012-06-30
9 2012-05-02 2 Atlanta 50000 2009-09-30
10 2012-05-02 2 Atlanta 50000 2020-06-30
2 2009-01-14 2 Chicago 30000 2013-03-31
3 2018-04-14 2 Chicago 100000 2013-03-31
7 2009-10-12 2 Los Angeles 80000 2018-03-31
6 2009-10-12 2 Los Angeles 80000 2013-12-31
CUMSUM Money Spent
0 670999999
1 670999999
5 567000
4 2300000
11 10000000
12 30000000
13 55000000
8 10000000
9 30000000
10 55000000
2 670999999
3 670999999
7 567000
6 2300000
【讨论】:
以上是关于在python中循环遍历数据框字典并将字典中的每个数据框与单个数据框合并的主要内容,如果未能解决你的问题,请参考以下文章