首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将两个数据按2列合并- Deedle

将两个数据按2列合并- Deedle
EN

Stack Overflow用户
提问于 2022-07-04 16:26:37
回答 1查看 116关注 0票数 1

我正试图以类似于熊猫中的merge的方式将两种deedle数据融合在一起。我将有一个更大的框架,其中有一个yearquarter列以及它旁边的其他数据,然后是一个更小的框架,其中有一个yearquarterad partner列。我想把广告合作伙伴添加到同一年度和同一季度的大表中的每一个实例中。

下面的链接中有一些示例数据:https://datascienceparichay.com/article/pandas-merge-dataframes-on-multiple-columns/

任何帮助都将不胜感激!

谢谢!

编辑

现在我有了这段代码,尽管如果df1中有一个不是df2中的键,并且没有返回一个表,它会抛出一个df2异常。

代码语言:javascript
复制
var df2ByYQ = df2.IndexRowsUsing(row => (row.GetAs<string>("Year".Trim()), row.GetAs<string>("Quarter".Trim())));
                
var bCol = df1.Rows.SelectOptional(kvp => df2ByYQ.Rows[(kvp.Value.Value.GetAs<string>("Year".Trim()), kvp.Value.Value.GetAs<string>("Quarter".Trim()))].TryGetAs<int>("b"));`
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-04 20:27:39

您可以通过重新索引这两个数据帧来实现这一点,以便它们都具有由由年份和季度组成的元组组成的相同行索引。最简单的方法是使用Frame.indexRowsUsing函数。例如,给定两个框架,其中一个为a列,另一个为b

代码语言:javascript
复制
let df1 =
  Frame.ofRecords [ 
    {|year=1999; quarter="q1"; a=1|} 
    {|year=1999; quarter="q2"; a=2|} ]

let df2 =
  Frame.ofRecords [ 
    {|year=1999; quarter="q1"; b=3|} 
    {|year=1999; quarter="q2"; b=4|} ]

let df1ByYQ = 
  df1 |> Frame.indexRowsUsing (fun row ->
    row.GetAs<int>("year"), row.GetAs<string>("quarter"))

let df2ByYQ = 
  df2 |> Frame.indexRowsUsing (fun row ->
    row.GetAs<int>("year"), row.GetAs<string>("quarter"))

现在您可以使用join连接这两个框架-您只需删除在两个框架中共享的列(操作不允许重叠列):

代码语言:javascript
复制
let res = 
  df1ByYQ
  |> Frame.dropCol "year"
  |> Frame.dropCol "quarter"
  |> Frame.join JoinKind.Inner df2ByYQ

编辑:在注释中讨论的场景中的,其中df1每年/季度有多个记录,我们希望从另一个数据帧中的唯一行中添加信息,我将重新索引其他数据帧,然后使用map操作在另一个数据帧中查找对应的匹配行(这将非常快,因为索引查找是通过哈希表完成的):

代码语言:javascript
复制
let df1 =
  Frame.ofRecords [ 
    {|year=1999; quarter="q1"; month="Jan"; a=1|} 
    {|year=1999; quarter="q1"; month="Feb"; a=2|} 
    {|year=1999; quarter="q2"; month="Jan"; a=3|} ]

let df2 =
  Frame.ofRecords [ 
    {|year=1999; quarter="q1"; b=3|} 
    {|year=1999; quarter="q2"; b=4|} ]

let df2ByYQ = 
  df2 |> Frame.indexRowsUsing (fun row ->
    row.GetAs<int>("year"), row.GetAs<string>("quarter"))

let bColumn = df1 |> Frame.mapRows (fun _ row ->
  df2ByYQ.Rows.[(row.GetAs "year", row.GetAs "quarter")].GetAs<int>("b") )

df1.AddColumn("b", bColumn)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72859702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档