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

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

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

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

pandas

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

Q&A

解決済

2回答

1531閲覧

「DataFrame」indexの同じデータを1列につなげたい

surpass

総合スコア3

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2020/09/07 23:10

DataFrameのindexの同じデータを1列に, つなげたい

df =

INDEX      番号 平均
201907010601 15 0.758492
201907010601 11 0.722583
201907010601 10 0.704865
201905010402 8 0.783678
201905010402 7 0.710182
201905010402 2 0.470611
201907010606 5 0.849760
201907010606 4 0.804972
201907010606 6 0.801182
201907010604 7 0.834579
201907010604 14 0.773029
201907010604 11 0.659245

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

上記のような, DataFrameからINDEXの同じデータを1列につなげたいのですが, やり方がわかりません.

理想は,INDEXごとに全て同じ列につなげることで,
df =

INDEX      番号_0 平均_0  番号_1 平均_1 番号_2 平均_2
201907010601 15 0.758492 11 0.722583 10 0.704865
201905010402 8 0.783678 7 0.710182 2 0.470611
201907010606 5 0.849760 4 0.804972 6 0.801182
201907010604 7 0.834579 14 0.773029 11 0.659245

もしくは,
df =

INDEX      番号_0 番号_1 番号_2
201907010601 15  11  10
201905010402 8  7 2
201907010606 5  4 6
201907010604 7  14 11

のような番号のみの出力にしたいと考えています.

試したこと

INDEXごとの処理ということで, groupby関数,
横方向への連結ということで, concat, mergeなどの連結関数を用いると考えているのですが具体的に, それらをどのように扱えば, 所望の変換が行えるかがわかりません.

素人質問で申し訳ありませんが, 御回答よろしくお願いいたします.

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

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

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

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

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

guest

回答2

0

縦に並んでいるデータを横向きに並べさせたい場合は、unstack()またはpivot()およびpivot_table()メソッドの使用を検討してください。
インデックスを変形する場合にはunstack()を、それ以外の場合はpivot()を用いるのが簡便です。
pandasでstack, unstack, pivotを使ってデータを整形 | note.nkmk.me


以下の例は、groupby.cumcount()を用いて'INDEX'が同じ行に0,1,2の連番を振り、さらにpd.pivot_table()を用いて行列を変形する方法です。

pandas.core.groupby.GroupBy.cumcount — pandas documentation
pandas.pivot_table — pandas documentation

python

1import io 2import pandas as pd 3 4data = io.StringIO("""INDEX,number,mean 5201907010601,15,0.758492 6201907010601,11,0.722583 7201907010601,10,0.704865 8201905010402,8,0.783678 9201905010402,7,0.710182 10201905010402,2,0.470611 11201907010606,5,0.849760 12201907010606,4,0.804972 13201907010606,6,0.801182 14201907010604,7,0.834579 15201907010604,14,0.773029 16201907010604,11,0.659245""") 17df = pd.read_csv(data)

このとき、

python

1pd.pivot_table(df, index='INDEX', columns=df.groupby('INDEX').cumcount()) 2# mean number 3# 0 1 2 0 1 2 4# INDEX 5# 201905010402 0.783678 0.710182 0.470611 8 7 2 6# 201907010601 0.758492 0.722583 0.704865 15 11 10 7# 201907010604 0.834579 0.773029 0.659245 7 14 11 8# 201907010606 0.849760 0.804972 0.801182 5 4 6

または、

python

1df.assign(n=df.groupby('INDEX').cumcount()).pivot(index='INDEX', columns='n') 2# number mean 3# n 0 1 2 0 1 2 4# INDEX 5# 201905010402 8 7 2 0.783678 0.710182 0.470611 6# 201907010601 15 11 10 0.758492 0.722583 0.704865 7# 201907010604 7 14 11 0.834579 0.773029 0.659245 8# 201907010606 5 4 6 0.849760 0.804972 0.801182

投稿2020/09/08 01:18

編集2020/09/08 01:46
kirara0048

総合スコア1399

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

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

0

ベストアンサー

一回データ抽出して形状変換、新しいdfに突っ込むとやりましたが、kirara0048さんのやり方のがスマートでしたね。

python3

1import io 2import pandas as pd 3 4table="""INDEX      番号 平均 5201907010601 15 0.758492 6201907010601 11 0.722583 7201907010601 10 0.704865 8201905010402 8 0.783678 9201905010402 7 0.710182 10201905010402 2 0.470611 11201907010606 5 0.849760 12201907010606 4 0.804972 13201907010606 6 0.801182 14201907010604 7 0.834579 15201907010604 14 0.773029 16201907010604 11 0.659245""" 17 18df = pd.read_table(io.StringIO(table), delimiter="\s+") 19 20#INDEX      番号 平均 21#0 201907010601 15 0.758492 22#1 201907010601 11 0.722583 23#2 201907010601 10 0.704865 24#3 201905010402 8 0.783678 25#4 201905010402 7 0.710182 26#5 201905010402 2 0.470611 27#6 201907010606 5 0.849760 28#7 201907010606 4 0.804972 29#8 201907010606 6 0.801182 30#9 201907010604 7 0.834579 31#10 201907010604 14 0.773029 32#11 201907010604 11 0.659245 33 34 35df_dct = {} 36for i in df.groupby(["INDEX   "]): 37 df_dct[i[0]] = i[1].values[:,1:].reshape(1,-1)[0] # valuesでnumpy配列にして、reshapeで1行に変換 38print(df_dct) 39# {201905010402: array([8. , 0.783678, 7. , 0.710182, 2. , 0.470611]), 201907010601: array([15. , 0.758492, 11. , 0.722583, 10. , 0.704865]), 201907010604: array([ 7. , 0.834579, 14. , 0.773029, 11. , 0.659245]), 201907010606: array([5. , 0.84976 , 4. , 0.804972, 6. , 0.801182])} 40 41df_dct2 = {} 42for k,v in df_dct.items(): # pd.Seriesに変換 43 df_dct2[k]=pd.Series(v) 44 45df2 = pd.DataFrame(df_dct2).T 46print(df2) 47# 0 1 2 3 4 5 48#201905010402 8.0 0.783678 7.0 0.710182 2.0 0.470611 49#201907010601 15.0 0.758492 11.0 0.722583 10.0 0.704865 50#201907010604 7.0 0.834579 14.0 0.773029 11.0 0.659245 51#201907010606 5.0 0.849760 4.0 0.804972 6.0 0.801182

投稿2020/09/08 01:40

編集2020/09/08 01:41
jeanbiego

総合スコア3966

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問