在 C# DataFrame 中查找数组值(相当于 Python 中的 .isin)?

我想将运行良好的 Python 脚本转换为 C#。

我有一个 C# DataFrame,使用Microsoft.Data.Analysis;库。列名是 [time] , [site], [samples], [temperature]

我需要处理两个顺序任务:

  1. 将具有相同 [time] 和 [site] 的行分组 --> 对 [sample] 中的值求和,并仅保留 [temperature] 列的 1 个值,最后一个。在 Python (Pandas) 中,我这样做了:

    dF_out= df_in.groupby(['time','site'], as_index=False).agg({'sample':'sum', 'temperature':'last'})

  2. 查找 [sample] 的匹配值与整数常量数组中的任何(所有!)值,在 Python 中,我完成了以下操作:

    df_out= df_out.loc[df_out['samples'].isin(int_array)]

在我更有信心的 Python 中,方法.GrouBy(...) .isin(...)方法很简单,并且在 Pandas 文档中有很好的描述。谁能帮助我以最有效的方式在 C# 中转换它?

先感谢您


杨魅力
浏览 182回答 2
2回答

斯蒂芬大帝

通过索引器访问行值,然后按时间和站点进行分组。假设第二个任务在第一个任务之后,您可以在一个操作中执行两个Select()任务:对本地分组的样本求和,保存为SamplesSum. 为了总结它,您需要转换为适当的类型,我以此int为例。从最后一个分组条目中获取最后一个温度,将其保存为LastTemperatureint_array最后,创建两个集合(和本地样本分组)的交集,将其保存为MatchingValues. 在这里,从数据框行中选择样本值时也不要忘记正确的转换我有点担心在没有先排序的情况下选择最后一个温度。最后一个将只是分组中的最后一个,不确定它是最小值还是最大值。var int_array = new int[] { 1, 2, 3 };var dF_out = df_in.Rows    .GroupBy(row => new { Time = row[0], Site = row[1] })    .Select(group => new    {        SamplesSum = group.Sum(row => (int)row[2]),        LastTemperature = group.Last()[3],        MatchingValues = int_array.Intersect(group.Select(row => (int)row[2])),    });结果dF_out集合将具有这样的结构:[   {      "SamplesSum":25,      "LastTemperature":28.0,      "MatchingValues":[         21,         4      ]   },   {      "SamplesSum":3,      "LastTemperature":27.0,      "MatchingValues":[         3      ]   }]

SMILET

我经历了类似的任务,所以我可以为其他读者报告一个可能的解决方案:using System.Linq;using Microsoft.Data.Analysis;// Assume that df_in is a DataFrame with columns [time], [site], [samples], and [temperature]var df_out = df_in.AsEnumerable()&nbsp; &nbsp; .GroupBy(row => new { Time = row.Field<DateTime>("time"), Site = row.Field<string>("site") })&nbsp; &nbsp; .Select(g => new&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Time = g.Key.Time,&nbsp; &nbsp; &nbsp; &nbsp; Site = g.Key.Site,&nbsp; &nbsp; &nbsp; &nbsp; Samples = g.Sum(row => row.Field<int>("samples")),&nbsp; &nbsp; &nbsp; &nbsp; Temperature = g.Last().Field<float>("temperature")&nbsp; &nbsp; })&nbsp; &nbsp; .ToDataFrame();然后是第二个任务,using System.Linq;// Assume that df_out is a DataFrame with a column [samples] and int_array is an array of integersvar filtered_df = df_out.AsEnumerable()&nbsp; &nbsp; .Where(row => int_array.Any(i => i == row.Field<int>("samples")))&nbsp; &nbsp; .ToDataFrame();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python