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



我想把一个运行良好的Python脚本转换成C#。

我有一个C#DataFrame,使用Microsoft.Data.Analysis;库。列名为[时间]、[地点]、[样本]、[温度]

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

  1. 将具有相同[时间]AND[站点]->对[sample]中的值求和,并只为[temperature]列保留一个值,最后一个。在Python(Pandas(中,我做到了:

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

  2. 在一个常量整数数组中查找[sample]与ANY(ALL!(值的匹配值,在Python中我做了以下操作:

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

在我更自信的Python中,方法.GrouBy(...).isin(...)方法很简单,在Pandas文档中描述得很好。有人能帮我用C#以最有效的方式转换吗?

提前感谢

  1. 通过索引器访问行值,然后按时间和地点分组
  2. 假设第二个任务在第一个任务之后,您可以在单个Select()操作中执行这两个任务:
  • 对来自本地分组的样本求和,将其保存为SamplesSum。为了求和,您需要转换为适当的类型,我使用了int作为示例
  • 从最后一个分组条目中获取最后一个温度,保存为LastTemperature
  • 最后,创建两个集合(int_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
]
}
]

我完成了一项类似的任务,这样我就可以为其他读者报告一个可能的解决方案:

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()
.GroupBy(row => new { Time = row.Field<DateTime>("time"), Site = row.Field<string>("site") })
.Select(g => new
{
Time = g.Key.Time,
Site = g.Key.Site,
Samples = g.Sum(row => row.Field<int>("samples")),
Temperature = g.Last().Field<float>("temperature")
})
.ToDataFrame();

那么对于第二个任务,

using System.Linq;
// Assume that df_out is a DataFrame with a column [samples] and int_array is an array of integers
var filtered_df = df_out.AsEnumerable()
.Where(row => int_array.Any(i => i == row.Field<int>("samples")))
.ToDataFrame();

最新更新