如何在熊猫中连接数据框?

Posted

技术标签:

【中文标题】如何在熊猫中连接数据框?【英文标题】:How to concat a dataframe in pandas? 【发布时间】:2016-03-09 13:29:20 【问题描述】:

我通过 pymongo 从 mongoDB 获取数据到 python,然后将其转换为 pandas 数据帧

df = pd.DataFrame(list(db.dataset2.find()))

这就是数据在 mongoDB 中的样子。

"dish" : [
      
        "dish_id"          : "005" ,
        "dish_name"        : "Sandwitch",
        "dish_price"       : 50,
        "coupon_applied"   : "Yes",              
        "coupon_type"      : "Rs 20 off"
      ,
      
        "dish_id"          : "006" ,
        "dish_name"        : "Chicken Hundi",
        "dish_price"       : 125,
        "coupon_applied"   : "No",
        "coupon_type"      : "Null"

      
   ],

我想在 pandas 数据框中将菜属性分成两行。这是执行此操作的代码。 (有 3 个菜文件)所以,我正在通过 for 循环对其进行迭代。

for i in range(0,len(df.dish)):
data_dish = json_normalize(df['dish'][i])
print data_dish

但它给了我下面的输出..

 coupon_applied   coupon_type   dish_id     dish_name       dish_price  
0            Yes   Rs 20 off     001     Chicken Biryani         120   
1             No        Null     001      Paneer Biryani         100   

coupon_applied  coupon_type     dish_id   dish_name        dish_price  
0        Yes       Rs 40 off     002     Mutton Biryani      130   
1        No          Null        004      Aaloo tikki         95   


coupon_applied   coupon_type    dish_id   dish_name        dish_price 
0     Yes         Rs 20 off      005      Sandwitch           50   
1     No             Null        006     Chicken Hundi        125   

我想以以下格式输出..

  coupon_applied   coupon_type   dish_id     dish_name       dish_price  
0     Yes          Rs 20 off      001     Chicken Biryani      120   
1     No             Null         001      Paneer Biryani      100   
2     Yes          Rs 40 off      002     Mutton Biryani       130   
3     No             Null         004      Aaloo tikki         95   
4     Yes         Rs 20 off       005      Sandwitch           50   
5     No             Null         006     Chicken Hundi        125   

你能帮我解决这个问题吗?在此先感谢:)

【问题讨论】:

你为什么不直接从mangoDB数据创建pd.DataFrame() 请考虑向我们提供数据帧的完整样本,以便重现问题。 【参考方案1】:

dishes = [json_normalize(d) for d in df['dish']]
df = pd.concat(dishes, ignore_index=True)

【讨论】:

那些不是 3 个不同的数据帧,而是一个数据帧,即由 json_normalize 函数返回。 还有一件事.. 我想根据菜(json 数组)复制数据框中的一些行。菜可能包含 3 道菜。当它只有一个时,我可以通过关注 def data_shape(dataframe): data_dish = json_normalize(dataframe['dish'][0]) count = len(data_dish) ## counting dishes ordered new_dataframe = pd.concat([dataframe]*count,ignore_index=True) final_dataframe = pd.concat([new_dataframe,data_dish],axis=1) print final_dataframe 来做到这一点 在此处发布一个新问题供您关注可能会更有成效,在 cmets 中理解起来有点棘手。如果您需要任何其他信息或者您认为上述答案可以接受,请告诉我。【参考方案2】:

您应该能够在列表中获取数据帧列表,然后将它们连接起来。

初始化一个新的数据框:

df = pd.DataFrame()

创建一个空的数据框列表:

dflist = []

循环和附加数据帧

for i in range(0,len(df.dish)):
    data_dish = json_normalize(df['dish'][i])
    dflist.append(data_dish)

然后将列表连接到完整的数据框中:

df = pd.concat(dflist, ignore_index=True)

【讨论】:

感谢您的 rpl。它正确地添加了索引。但是相同的数据框重复了 3 次。 @user2927983 是的,也许尝试更改其他答案中报告的循环索引。

以上是关于如何在熊猫中连接数据框?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有分组的情况下连接熊猫中数据框一列的所有行[重复]

如何合并/连接两个不同长度的熊猫数据框?

如何从左右连接两个熊猫数据框?

熊猫:连接数据框时如何聚合两个列表列

当两个数据框都包含重复键时,如何将两个熊猫数据框与左连接合并?

熊猫中的列连接