在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 was passed”

谢谢。

【问题讨论】:

如何读取所有这些数据帧?为什么有这么多单独的数据框?例如,如果您读入的每个人都有 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中循环遍历数据框字典并将字典中的每个数据框与单个数据框合并的主要内容,如果未能解决你的问题,请参考以下文章

Python---循环遍历带有数据框的字典

循环遍历python中的数据框字典

循环遍历数据框字典中的数据框

循环遍历 python 字典并操作每个值

如何从Twitter Search API创建pandas数据框?

python3循环遍历嵌套字典替换指定值