Pandas.Dataframe.merge v Linq 加入

Posted

技术标签:

【中文标题】Pandas.Dataframe.merge v Linq 加入【英文标题】:Pandas.Dataframe.merge v Linq Join 【发布时间】:2019-06-12 14:25:53 【问题描述】:

必须迁移一些 Python 代码,该代码在给定时间段内读取 GA 转储的两个视图,然后将它们合并。工作正常。发现我的 C# 挂在 Join 上

Python

private_key_loc = <<key>>

sql = <<bigquery>>
impressions_all = pd.read_gbq(<<bigquery>>,private_key = private_key_loc)

 sql = <<bigquery2>>

 clicks_all = pd.read_gbq(sql, private_key = private_key_loc)

 ctr = pd.merge(impressions_all, clicks_all, 
 how = 'left', 
 left_on = ['fullvisitorID','visitNumber','hits_hitnumber','visit_date','spid_seen' ], 
 right_on = ['fullvisitorID','visitNumber','hits_hitNumber','visit_date','SPID_clicked'])

C#

    GoogleCredential credential = GoogleCredential.FromFile("<<FILE>>");
var client = BigQueryClient.Create("<<ProjectId>>",credential);

string sql = $@"<BigQuery";

BigQueryResults impressions = client.ExecuteQuery(sql, 
                        null, new QueryOptions  UseLegacySql = true );

string sql = $@"<BigQuery2>>";


BigQueryResults clicks = client.ExecuteQuery(sql, 
                        null, new QueryOptions  UseLegacySql = true );


var ctr = from impression in impressions
    from click in clicks
    where impression["fullvisitorID"] == click["fullvisitorID"]
          && impression["visitNumber"] == click["visitNumber"]
          && impression["hits_hitnumber"] == click["hits_hitnumber"]
          && impression["visit_date"] == click["visit_date"]
          && impression["spid_seen"] == click["SPID_clicked"]
    select new impression, click;

ctr = ctr.ToList();

代码挂在最后一行。

编辑:

我尝试通过在加入前调用 ToList() 来实现展示次数和点击次数。好像没什么区别。

【问题讨论】:

您是否已隔离问题?我们可以复制它吗? 问题是linq表达式挂了。数据很大,而且是私有的,所以不能发布。 这就是我评论的原因。您应该从一个可重现的小例子开始。如果问题与您的数据有关,则属于本地问题,我们无法为您提供帮助。 @LeonardoHerrera 我很欣赏这一点,但这似乎是一个相当标准的实现,并且数据是导入 BigQuery 的标准 Google Analytics 数据。 这些查询不是略有不同吗?您的 pandas 看起来像 LEFT OUTER JOIN,而您的 linq 看起来像 INNER JOIN,但取决于 linq 如何将其转换为 BigQuery 语法,也可能是 CROSS JOIN:cloud.google.com/bigquery/docs/reference/standard-sql/… 【参考方案1】:

使用 BigQuery 时,CROSS JOIN 可以显式编写(见上文)或隐式使用逗号分隔 from_items。您应该尝试使用少量数据,这样您就可以了解 Linq 如何将您的查询转换为 INNER JOIN 或 CROSS JOIN。

如果是第二个选项,这解释了为什么您的代码“挂起”,因为 CROSS JOIN 是您的表的 cartesian product,这将是巨大的(500k * 50k = 250,00,000,000 行!)。


【讨论】:

以上是关于Pandas.Dataframe.merge v Linq 加入的主要内容,如果未能解决你的问题,请参考以下文章

selenium chromedriver geckodriver iedriverserver下载

golang:%v,%+v,%#v的区别

v-show、v-if、v-bind

Vue.js常用指令汇总(v-if//v-show//v-else//v-for//v-bind//v-on等)

根据每个元素的i属性,由小到大排列如下数组ar=[{i:5,v:1},{i:5,v:4},{i:2,v:1},{i:1,v:3},{i:3,v:2},{i:6,v:1},{i:4,v:1}];

证明 U and V={0}时 dim(U+V)=dim(U)+dim(V)