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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

708閲覧

CSVデータの振り分けについて

oilman

総合スコア14

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/04/16 02:25

前提・実現したいこと

Pythonを勉強中のものです。

time,event
2018/10/24 10:18,logon
2018/10/24 11:50,logoff
2018/10/24 14:19,logon
2018/10/24 17:27,logoff
2018/10/29 13:28,logon
2018/10/29 14:01,logon
2018/10/29 16:03,logoff
2018/10/30 9:28,logon
2018/10/30 13:00,logoff
2018/10/31 18:17,logon
2018/10/31 18:48,logoff
2018/11/1 10:19,logon
2018/11/1 20:39,logoff
2018/11/5 10:54,logon
2018/11/14 22:05,logoff
2018/11/15 8:37,logon
2018/11/16 19:22,logoff
2018/11/19 10:17,logon
2018/11/21 13:05,logoff
2018/11/26 9:49,logon
2018/11/26 10:04,logon
2018/11/27 22:20,logoff
2018/11/29 8:59,logon
2018/12/5 18:28,logoff

の「sample.csv」を読み込ませて、「logon」と「logoff」を振り分けたいです。
しかし、そのCSVデータに対して、同じ日付にlogonが重複している箇所が2箇所あります。

###期待している結果
logoff logon
2018/10/24 11:50 2018/10/24 10:18
2018/10/24 17:27 2018/10/24 14:19
NaN 2018/10/29 13:28
2018/10/29 16:03 2018/10/29 14:01
2018/10/30 13:00 2018/10/30 9:28
2018/10/31 18:48 2018/10/31 18:17
2018/11/1 20:39 2018/11/1 10:19
2018/11/14 22:05 2018/11/5 10:54
2018/11/16 19:22 2018/11/15 8:37
2018/11/21 13:05 2018/11/19 10:17
NaN 2018/11/26 9:49
2018/11/27 22:20 2018/11/26 10:04
2018/12/5 18:28 2018/11/29 8:59

###試したところ

import pandas as pd df = pd.read_csv('sample.csv') pd.pivot_table(df, values=None, columns=['event'], aggfunc='first', index=df.index//2)

Pandasのpivot_tableを使っても、上表の期待している結果に行きません。

time
event logoff logon
0 2018/10/24 11:50 2018/10/24 10:18
1 2018/10/24 17:27 2018/10/24 14:19
2 NaN 2018/10/29 13:28
3 2018/10/29 16:03 2018/10/30 9:28
4 2018/10/30 13:00 2018/10/31 18:17
5 2018/10/31 18:48 2018/11/1 10:19
6 2018/11/1 20:39 2018/11/5 10:54
7 2018/11/14 22:05 2018/11/15 8:37
8 2018/11/16 19:22 2018/11/19 10:17
9 2018/11/21 13:05 2018/11/26 9:49
10 2018/11/27 22:20 2018/11/26 10:04
11 2018/12/5 18:28 2018/11/29 8:59

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

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

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

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

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

guest

回答1

0

ベストアンサー

もうすこしスマートな方法があるかもしれませんが・・・。

とりあえずは、(df['event']=='logon').cumsum()にて新しいIndexを作成した後に unstack()を使用することで実現できます。(pivot_table() でもいけるかもしれません。)

logoff が 2つ重なったば場合には対応しておりません

下記は unstack()を行ったサンプルです。

Python

1import pandas as pd 2import io 3 4data = """ 5time,event 62018/10/24 10:18,logon 72018/10/24 11:50,logoff 82018/10/24 14:19,logon 92018/10/24 17:27,logoff 102018/10/29 13:28,logon 112018/10/29 14:01,logon 122018/10/29 16:03,logoff 132018/10/30 9:28,logon 142018/10/30 13:00,logoff 152018/10/31 18:17,logon 162018/10/31 18:48,logoff 172018/11/1 10:19,logon 182018/11/1 20:39,logoff 192018/11/5 10:54,logon 202018/11/14 22:05,logoff 212018/11/15 8:37,logon 222018/11/16 19:22,logoff 232018/11/19 10:17,logon 242018/11/21 13:05,logoff 252018/11/26 9:49,logon 262018/11/26 10:04,logon 272018/11/27 22:20,logoff 282018/11/29 8:59,logon 292018/12/5 18:28,logoff 30""" 31df = pd.read_csv(io.StringIO(data), parse_dates=['time']) 32 33df = df.set_index([(df['event']=='logon').cumsum(), 'event']).unstack() 34# time 35#event logoff logon 36#event 37#1 2018-10-24 11:50:00 2018-10-24 10:18:00 38#2 2018-10-24 17:27:00 2018-10-24 14:19:00 39#3 NaT 2018-10-29 13:28:00 40#4 2018-10-29 16:03:00 2018-10-29 14:01:00 41#5 2018-10-30 13:00:00 2018-10-30 09:28:00 42#6 2018-10-31 18:48:00 2018-10-31 18:17:00 43#7 2018-11-01 20:39:00 2018-11-01 10:19:00 44#8 2018-11-14 22:05:00 2018-11-05 10:54:00 45#9 2018-11-16 19:22:00 2018-11-15 08:37:00 46#10 2018-11-21 13:05:00 2018-11-19 10:17:00 47#11 NaT 2018-11-26 09:49:00 48#12 2018-11-27 22:20:00 2018-11-26 10:04:00 49#13 2018-12-05 18:28:00 2018-11-29 08:59:00

投稿2019/04/16 04:28

magichan

総合スコア15898

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

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

oilman

2019/04/16 10:35

早速のご回答ありがとうございます。 logonが重複している場合でも、動きました。 logonとlogoffが重複した場合の方法も知りたいです。 どうか、教えていただけないでしょうか?
magichan

2019/04/16 10:59

どうしましょうかね。。 上記の例では 『event列が 'logon' であったら次の行に移行する』 という条件だったので、 『event列が 'logon' または、event列が前の行と同じ値であったら行に移行する』 という条件で大丈夫な気がしますがどうでしょうか。コードにすると df = df.set_index([((df['event']=='logon') | (df['event'] == df['event'].shift(1))).cumsum(), 'event']).unstack() となります。ちょっと長いので2行に分けると df['grp'] = ((df['event']=='logon') | (df['event'] == df['event'].shift(1))).cumsum() df = df.set_index(['grp', 'event']).unstack() となりますね。
oilman

2019/04/16 12:38

ご回答ありがとうございます。条件について、理解していませんでした。 『event列が 'logon' であったら次の行に移行する』で、理解しました。 このヒントをもとに、少しずつ改良していきたいと思っています。
magichan

2019/04/16 13:19

はい、そういうことです。 あと今思ったのですが、2行で分けた場合の2行目は set_index().unstack() を使うよりも、pivot() やpivot_table() を使った方が素直な実装になりますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問