2 回答
TA贡献1827条经验 获得超8个赞
通过索引器访问行值,然后按时间和站点进行分组。
假设第二个任务在第一个任务之后,您可以在一个操作中执行两个
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
]
}
]
TA贡献1796条经验 获得超4个赞
我经历了类似的任务,所以我可以为其他读者报告一个可能的解决方案:
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();
添加回答
举报