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下载
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}];