为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

杨魅力 2023-06-06 16:12:42
我想将运行良好的 Python 脚本转换为 C#。我有一个 C# DataFrame,使用Microsoft.Data.Analysis;库。列名是 [time] , [site], [samples], [temperature]我需要处理两个顺序任务:将具有相同 [time] 和 [site] 的行分组 --> 对 [sample] 中的值求和,并仅保留 [temperature] 列的 1 个值,最后一个。在 Python (Pandas) 中,我这样做了:dF_out= df_in.groupby(['time','site'], as_index=False).agg({'sample':'sum', 'temperature':'last'})查找 [sample] 的匹配值与整数常量数组中的任何(所有!)值,在 Python 中,我完成了以下操作:df_out= df_out.loc[df_out['samples'].isin(int_array)]在我更有信心的 Python 中,方法.GrouBy(...) .isin(...)方法很简单,并且在 Pandas 文档中有很好的描述。谁能帮助我以最有效的方式在 C# 中转换它?先感谢您
查看完整描述

2 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

  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

      ]

   }

]


查看完整回答
反对 回复 2023-06-06
?
SMILET

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


查看完整回答
反对 回复 2023-06-06
  • 2 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信