データテーブル上で計算する方法

Excel上もしくはデータテーブル上で、全データの平均値を出す方法はありますか?

価格の表記には万円や億が含まれており、文字列となっています。
膨大なデータになるため、ループ処理で型変換と足し算をしていく方法ではなく、関数を設定して取得する方法を取りたかったのですが文字列の為できませんでした。

Excelに出力したデータテーブルも添付いたします。
sample.xlsx (9.4 KB)

LINQを使用して実現できると思います。以下前提条件です。

  • 入力の数値部分は整数のみで、小数は想定しない。前後に無関係な数字を含まない。
  • 単位はすべて共通(この場合は"万円")である。
  • 列名は “価格” 。
average = dt.AsEnumerable.Average(Function(row) Int32.Parse(System.Text.RegularExpressions.Regex.Replace(row("価格").ToString, "^[\d]", "")))
1 Like

こんにちは

52行目、57行目は先にデータ整理しておいた方が良いかと思いますが、
このまま処理するのであれば、例えば以下になると思います。

img20220318-5

res = dt.AsEnumerable.SelectMany(Function(r)  System.Text.RegularExpressions.Regex.Matches(r("価格").ToString,"[,\w]+").Cast(Of System.Text.RegularExpressions.Match).Select(Function(m) Decimal.Parse(m.Value.Replace("万円","0000").Replace("億",""),System.Globalization.NumberStyles.Any))).Average()

Sample20220318-5.zip (9.5 KB)

1 Like

ありがとうございます。
こちらの方法で、他にも最小値や最大値を取得したかったので簡単な応用ででき大変助かりました。

もう一点、同じような内容になるのですが、価格列の文字が「100.90m² (30.5坪)」だった場合に、「m²」より前までの数値を使用して平均を出したい場合はどこを書き換えれば良いでしょうか?
Indexofなどを使うのかと思い挑戦してみましたが、エラーが多発してしまいなんだかよくわからなくなってしまいました。。

こんにちは

上記の式は、サンプルデータに対しての最低限の変換しか考慮していませんので、
様々なバリエーションがあったときにそれに対応する必要がある点ご留意ください。
例えば1億円というデータではエラーになると思います。

もう一点、同じような内容になるのですが、価格列の文字が「100.90m² (30.5坪)」だった場合に、「m²」より前までの数値を使用して平均を出したい場合はどこを書き換えれば良いでしょうか?
Indexofなどを使うのかと思い挑戦してみましたが、エラーが多発してしまいなんだかよくわからなくなってしまいました。。

String.IndexOfを使うなら

r("ColumnName").ToString.Substring(0,r("ColumnName").ToString.IndexOf("m2"))

Regexを使うなら

System.Text.RegularExpressions.Regex.Match(r("ColumnName").ToString,"^.*?(?=m2)").Value

平方メートルの部分は実際の正確な文字に合わせてください。

ありがとうございます。

以下のような書き方で合っていますでしょうか?

res = dt.AsEnumerable.SelectMany(Function(r)  System.Text.RegularExpressions.Regex.Match(r("ColumnName").ToString,"^.*?(?=m2)").Value,System.Globalization.NumberStyles.Any).Average()

上記の記述ではうまくできませんでした。。
.Castの手前までを下記に書き換えてみたところ、「型 ‘System.Char’ のオブジェクトを型 ‘System.Text.RegularExpressions.Match’ にキャストできません。」とエラーになりました。

ExtractDataTable.AsEnumerable.SelectMany(Function(r)  r("建物面積").ToString.Substring(0,r("建物面積").ToString.IndexOf("m²")).Cast(Of System.Text.RegularExpressions.Match).Select(Function(m) Double.Parse(m.Value.Replace("万円","0000"),System.Globalization.NumberStyles.Any))).Average()

サンプルのExcelを添付させていただきます。

sample2.xlsx (8.8 KB)

こんにちは

例えば以下のようになります。

dt.AsEnumerable.Select(Function(r) Double.Parse(System.Text.RegularExpressions.Regex.Match(r("建物面積").ToString,"^.*?(?=m²)").Value)).Average()

ありがとうございます。
先程貼ったExcelファイルを間違えてしまったのですが、列内に「-」が含まれる場合、計算から省きたいのですが、どこをどのようにしたら良いでしょうか?
応用ができず申し訳ございません。。

スクリーンショット 2022-03-22 174215

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.