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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1016閲覧

Python 指定の場所の数字だけをDataFrameで表示する

pon244

総合スコア59

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/03/04 05:25

grp1=df.groupby('Time').sum() grp1['CPI']=grp1['Spend']/grp1['Installs'] grp1['前日との差分Spend'] = grp1['Spend'].diff() grp1['前日との差分CPI'] = grp1['CPI'].diff() grp1[['Spend', 'CPI','前日との差分Spend','前日との差分CPI']].round()

【試したこと】

a=grp1[['Spend', 'CPI','前日との差分Spend','前日との差分CPI']].round() a.index[3][['Spend', 'CPI','前日との差分Spend','前日との差分CPI']].round() a.index[3]で2020-02-23の数字は帰ってきます。 a.index['2020-02-23']ではエラーになります。おそらくIndexに設定してるからかも。 実際の表は多いので、指定の期間だけを表示できるようにしたい。

grp1の結果
|Time|Spend|CPI|前日との差分Spend|前日との差分CPI|
|:--|:--:|--:|
|2020-02-21|10|5|0|0
|2020-02-22|20|6|10|1
|2020-02-23|30|7|10|1
|2020-02-24|40|8|10|1

欲しい結果
|Time|Spend|CPI|前日との差分Spend|前日との差分CPI|
|:--|:--:|--:|
|2020-02-23|30|7|10|1
|2020-02-24|40|8|10|1

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

日時データを扱っており、そのデータをIndexとしているのであれば、データの型をDatetime型としてDatetimeIndexとすることをお勧めいたします。

https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#indexing

このようにすることで、 日時でのスライスを使ってデータの一部を取得することができるようになります。

Python

1import pandas as pd 2import io 3 4data = """ 5Time,Spend,CPI,前日との差分Spend,前日との差分CPI 62020-02-21,10,5,0,0 72020-02-22,20,6,10,1 82020-02-23,30,7,10,1 92020-02-24,40,8,10,1 102020-02-25,50,9,10,1 11""" 12 13df = pd.read_csv(io.StringIO(data)) 14 15#Time行をIndex化 16df = df.set_index('Time', drop=True) 17 18#Time行(index)をdatetime型に変換 19df.index = pd.to_datetime(df.index) 20 21# 2/22のデータ 22print(df.loc['2020/2/22']) 23#Spend 20 24#CPI 6 25#前日との差分Spend 10 26#前日との差分CPI 1 27#Name: 2020-02-22 00:00:00, dtype: int64 28 29# 2/23以降のデータ 30print(df.loc['2020/2/23':]) 31# Spend CPI 前日との差分Spend 前日との差分CPI 32#Time 33#2020-02-23 30 7 10 1 34#2020-02-24 40 8 10 1 35#2020-02-25 50 9 10 1 36 37# 2/22以前のデータ 38print(df.loc[:'2020/2/23']) 39# Spend CPI 前日との差分Spend 前日との差分CPI 40#Time 41#2020-02-21 10 5 0 0 42#2020-02-22 20 6 10 1 43#2020-02-23 30 7 10 1 44 45# 2/22 - 2/24の間のデータ 46print(df.loc['2020/2/22':'2020/2/24']) 47# Spend CPI 前日との差分Spend 前日との差分CPI 48#Time 49#2020-02-22 20 6 10 1 50#2020-02-23 30 7 10 1 51#2020-02-24 40 8 10 1

投稿2020/03/04 06:23

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pon244

2020/03/04 06:37

grp1[['Spend', 'CPI','前日との差分Spend','前日との差分CPI']].round() grp1.index = pd.to_datetime(grp1.index) grp1.loc['2020/2/22'] 上記のように当てはめたのですが、選択したデータ以外がDataFrame出ない形で出てしまったのですが、 何が間違ってるいるのでしょうか、、、泣
pon244

2020/03/04 06:40

下記のように変数にしてからだと取れました!これをDataFrameの形で抽出することは可能でしょうか これをDataFrameのように表示する方法 an=grp1[['Spend', 'CPI','前日との差分Spend','前日との差分CPI']].round() an.index = pd.to_datetime(an.index) an.loc['2020/2/22']
magichan

2020/03/04 06:56

データを1行だけ選択すると通常は Seriesデータとして結果が得られます。 どうしても Dataframeの形で得たいのであれば、スライスで始点と終点を同じ値で指定するとかが一番わかり安いかな。。 an.loc['2020/2/22':'2020/2/22']
pon244

2020/03/04 07:05

ありがとうございます! したかったことが実現できました!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問