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

v64noz0r  于 2023-01-07  发布在  C#
关注(0)|答案(2)|浏览(378)

我想把一个运行良好的Python脚本转换成C#。
我有一个C#DataFrame,使用Microsoft.Data.Analysis;库。列名是[时间]、[地点]、[样本]、[温度]
我需要处理两个连续的任务:
1.用相同的[time] AND [site]对行进行分组--〉对[sample]中的值求和,只保留[temperature]列的一个值,最后一个。
dF_out= df_in.groupby(['time','site'], as_index=False).agg({'sample':'sum', 'temperature':'last'})
1.在一个常量整数数组中找到与任意(ALL!)值匹配的[sample]值,在Python中我做了以下操作:
df_out= df_out.loc[df_out['samples'].isin(int_array)]
在Python中,我更有信心,方法.GrouBy(...).isin(...)方法是直接的,并且在Pandas文档中描述得非常好。有人能帮助我以最有效的方式将其转换为C#吗?
先谢谢你

5ssjco0h

5ssjco0h1#

1.通过indexer访问行值,然后按时间和地点分组。
1.假设第二个任务在第一个任务之后,您可以在单个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
      ]
   }
]
gfttwv5a

gfttwv5a2#

我经历了一个类似的任务,所以我可以报告一个可能的解决方案,为其他读者:

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();

相关问题