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

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

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

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

pandas

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

Q&A

解決済

1回答

288閲覧

Python pandasを使った列から行の転地方法を教えてください。

kapotanasana

総合スコア8

Python

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

pandas

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

0グッド

0クリップ

投稿2018/01/10 05:25

Pandasで整形されたDataflameの要素を列から行に転地させる方法を教えてください。
単純に列から行に変換するのではなく、特定時間内の要素を抽出し、その要素を扱って転地させたいです。

[前提条件]

変換前のデータは、type1~3,centerが異なる間隔でVALUEとUnixTimeが行に追加されてます。
type1 ・・・ 60秒間隔
type2,type3,center ・・・300秒間隔

その中から、centerのUnixTime時間を中心に直近のtype1,type2,type3のVALUEを抽出し行に変換させたいです。存在しない要素は、Noneとする。
※[変換前データ]から[変換後データ]に変換するイメージです。

[変換前データ]
TYPE VALUE UnixTime
0 type1 1702563840 1515023945
... ... ... ...
2663 type1 1410232320 1515475537
2664 type1 1440903168 1515475597
2665 type2 99 1515475610
2666 center 76 1515475613
2667 type3 8888 1515475616
2668 type1 1420496896 1515475657
2669 type1 1421422592 1515475717
2670 type1 1422209024 1515475777
2671 type1 1421869056 1515475837
2672 type1 1421123584 1515475897
2673 type2 99 1515475910
2674 center 76 1515475913
2675 type3 8888 1515475915
2676 type1 1420967936 1515475957
2677 type1 1425268736 1515476017
2678 type1 1425866752 1515476077
2679 type1 1427623936 1515476137
2680 type1 1426640896 1515476197
2681 type2 99 1515476210
2682 center 76 1515476213
2683 type3 8888 1515476215
2684 type1 1424646144 1515476257
2685 type1 1426501632 1515476317
2686 type1 1428205568 1515476377
2687 type1 1428369408 1515476437
2688 type1 1428361216 1515476497
2689 type2 99 1515476510
2690 center 76 1515476513
2691 type3 8888 1515476515
2692 type1 1426857984 1515476557

[2693 rows x 3 columns]

[変換後データ]
※UnixTimeは、centerの時間
type1, type2, type3, center, UnixTime
0 VALUE, VALUE, VALUE, VALUE, UnixTime
1 VALUE, VALUE, VALUE, VALUE, UnixTime
... ... ... ... ... ...

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

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

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

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

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

guest

回答1

0

ベストアンサー

結構面倒かも・・
とりあえずの方法としては

  1. unixtimeをIndexに設定
  2. dataframeから centerを抜き出す
  3. dataframeから type1を抜き出し、2のデータのIndexでreindex(method='nearest')する
  4. 2のデータと3のデータを結合する
  5. type2,type3で上記3~4を繰り返す
  6. unixtimeをIndexから外す

で良いかと思います。

一応サンプルコードです。

Python

1import pandas as pd 2import io 3 4# ダミーデータ 5data="""type,value,unixtime 6type1,1410232320,1515475537 7type1,1440903168,1515475597 8type2, 97,1515475610 9center,76,1515475613 10type3,8887,1515475616 11type1,1420496896,1515475657 12type1,1421422592,1515475717 13type1,1422209024,1515475777 14type1,1421869056,1515475837 15type1,1421123584,1515475897 16type2, 98,1515475910 17center,77,1515475913 18type3,8888,1515475915 19type1,1420967936,1515475957 20type1,1425268736,1515476017 21type1,1425866752,1515476077 22type1,1427623936,1515476137 23type1,1426640896,1515476197 24type2, 99,1515476210 25center,78,1515476213 26type3,8889,1515476215 27type1,1424646144,1515476257 28type1,1426501632,1515476317 29type1,1428205568,1515476377 30type1,1428369408,1515476437 31""" 32df = pd.read_csv(io.StringIO(data)) 33 34 35# unixtime を Indexに設定 36df = df.set_index('unixtime', drop=True) 37 38# centerのデータを抜き出す 39result = df.loc[df['type'] == 'center', 'value'].rename('center') 40for name in ['type1', 'type2', 'type3']: 41 # type1~3のデータをcenterのIndexに近いデータで再構築 42 new_col = df.loc[df['type'] == name, 'value'].reindex(result.index, method='nearest').rename(name) 43 # 結合 44 result = pd.concat([result, new_col], axis=1) 45 46# 後処理(必用であれば) 47# datetime をIndexから外し、Indexを振りなおす 48result = result.reset_index() 49 50print(result) 51# unixtime center type1 type2 type3 52# 0 1515475613 76 1440903168 97 8887 53# 1 1515475913 77 1421123584 98 8888 54# 2 1515476213 78 1426640896 99 8889

投稿2018/01/10 12:35

magichan

総合スコア15898

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問