我正试图以类似于熊猫中的merge的方式将两种deedle数据融合在一起。我将有一个更大的框架,其中有一个year和quarter列以及它旁边的其他数据,然后是一个更小的框架,其中有一个year、quarter和ad partner列。我想把广告合作伙伴添加到同一年度和同一季度的大表中的每一个实例中。
下面的链接中有一些示例数据:https://datascienceparichay.com/article/pandas-merge-dataframes-on-multiple-columns/
任何帮助都将不胜感激!
谢谢!
编辑
现在我有了这段代码,尽管如果df1中有一个不是df2中的键,并且没有返回一个表,它会抛出一个df2异常。
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"));`发布于 2022-07-04 20:27:39
您可以通过重新索引这两个数据帧来实现这一点,以便它们都具有由由年份和季度组成的元组组成的相同行索引。最简单的方法是使用Frame.indexRowsUsing函数。例如,给定两个框架,其中一个为a列,另一个为b:
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连接这两个框架-您只需删除在两个框架中共享的列(操作不允许重叠列):
let res =
df1ByYQ
|> Frame.dropCol "year"
|> Frame.dropCol "quarter"
|> Frame.join JoinKind.Inner df2ByYQ编辑:在注释中讨论的场景中的,其中df1每年/季度有多个记录,我们希望从另一个数据帧中的唯一行中添加信息,我将重新索引其他数据帧,然后使用map操作在另一个数据帧中查找对应的匹配行(这将非常快,因为索引查找是通过哈希表完成的):
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)https://stackoverflow.com/questions/72859702
复制相似问题