質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.05%

Pythonで、「ExcelでいうCOUNTIFを繰り返し行う」のようなことをやりたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 585

Taiga_s

score 7

やりたいこと

初心者です。

csvを読み込んで、
①範囲を指定する
②「指定した範囲の行の中で、-1以下となる数字をいくつあるかカウントする」
③↑の範囲を1行ずつずらしながらカウントしていく(総行数に達するまで)
④[カウントした値, 範囲の始めの行]でグラフ化する

ということをやりたいです。

df = pd.read_csv('1104.csv')
x = df['time']
y = df['gFz']-0.98

print(df)
plt.figure(figsize=(16, 8))
plt.plot(x,y)


で下の結果が出るようなcsv(25.3MB)なのですが、
イメージ説明

このcsvの'gFz'列で、
0~450行の間に-1以下である数字を数える(num=0)
1~451行の間に-1以下である数字を数える(num=1)
2~452行の間に-1以下である数字を数える(num=2)
3~453行の間に-1以下である数字を数える(num=3)
4~454行の間に-1以下である数字がを数える(num=4)

…(繰り返していく)

N(総行数)-450 ~ N行の間に-1以下である数字を数える(num=N-450)
#カウント終了

[カウントした値, 範囲の始めの行]でグラフ化する

と言った具合で、
ある範囲の行(450行)のうち、-1以下である数字の個数をカウントしていき、
その個数をグラフとして出力したいのです。

例えば↓のようなイメージです。

イメージ説明
イメージ説明
イメージ説明
イメージ説明
イメージ説明
イメージ説明
イメージ説明
イメージ説明
イメージ説明

上の図の赤線のようなグラフを作りたいです。

かなりややこしい内容ですが、
上記のグラフ作成方法について分かる方いらっしゃいましたら、
ご回答いただけると幸いです。

よろしくお願い申し上げます。

(また、調べたところ
Pythonはfor文やwhile文が遅いみたいなので、こういったプログラムは
パイソンではなく他の言語でやるべきなのでしょうか?
それともPythonでもできるのでしょうか??)

該当のソースコード

自分なりにやってみましたが、

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

df = pd.read_csv('1104.csv')
z = df['gFz']
N = len(df['time']) #サンプリング数
num = 0
while num<=N:
    R = z[num:num + 450]
    C = sum(x < -1 for x in R)
    plt.plot(num,C)
    plt.draw()
    num += 1


と打つと、jupyter notebookが固まってしまいます。

発生している問題・エラーメッセージ

jupyter notebookが固まってしまいます…

補足情報(FW/ツールのバージョンなど)

macOS Catalina 10.15
jupyter notebook

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

rolling()を使うことで解決できました!

import pandas as pd
import numpy as np

df = pd.read_csv('1104.csv')

//"df['gFz']-0.98 <= -1をカウントする"を1行ずつずらして行う
//rolling(範囲行数)
ret = (df['gFz']<=-0.02).rolling(55000).sum()
plt.plot(ret)

と打つことで、
指定した列・行のなかで、-1以下の値をカウントし続けたグラフを描くことができました!!

イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

以下でどうですか?

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('1104.csv')
v = df["gFz"].values

startLines = range(0, len(df)-450)

r = [sum(x < -1 for x in v[i:i+450]) for i in startLines]

plt.title('[count, startline]')
plt.xlabel('start line')
plt.ylabel('count')
plt.scatter(startLines, r)
plt.show()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る