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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python

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

Q&A

1回答

340閲覧

Pythonを用いて旅行データを1行にまとめたデータを作る

tatsumi-1

総合スコア11

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python

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

0グッド

0クリップ

投稿2018/11/15 08:16

前提・実現したいこと

Pythonを用いて旅行データを1行にまとめたデータを作りたいです.

|旅行者|出発地|目的地|
|1|大阪|東京|
|1|東京|北海道|
|1|北海道|大阪|
|2|大阪|福岡|
|2|福岡|大阪|
というデータを

|旅行者|出発地|経由地1|経由地2|到着地|
|1|0|0|0|0|
|2|0|0|0│0|
というデータフレームを作り

|旅行者|出発地|経由地1|経由地2|到着地|
|1|大阪|東京|北海道|大阪|
|2|大阪|福岡|0│大阪|

といった旅行者1人の旅行を1行にまとめたいです.

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

|旅行者|出発地|経由地1|経由地2|到着地|
|0|大阪|大阪|大阪|大阪|
|0|大阪|大阪|大阪|大阪|
という形になっておりうまくできません

該当のソースコード

コード import pandas as pd df=pd.read_excel('旅行データ') df1=pd.DataFrame({'旅行者':[0,0], '出発地':[0,0],'訪問地1':[0,0],'訪問地2':[0,0],'到着地':[0,0]},index=[0,1],dtype=str) for i in range(5): for j in range(2): for k in range(1,5): df1.at[df1.index[j],df1.columns[k]]=df.at[df.index[i],'目的地'] if df.at[df.index[i],'旅行者']==df.at[df.index[i+1],'旅行者']: df1.at[df1.index[j],df1.columns[k+1]]=df.at[df.index[i+1],'目的地'] if df.at[df.index[i],'旅行者']!=df.at[df.index[i+1],'サンプルID']: df1.at[df1.index[j+1],df1.columns[k]]=df.at[df.index[i+1],'旅行者']

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

Anconda Navigatorでjupyter Notebookを使用しています.

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

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

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

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

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

yamato_user

2018/11/15 08:54

dfの出力を記述してください
tatsumi-1

2018/11/16 03:45

dfの出力は一番最初の表です.分かりにくくてすいません.
tatsumi-1

2018/11/16 03:51

dfの出力は一番最初の表の状態です.
KojiDoi

2018/11/16 05:52

3箇所以上を経由することはありえないという前提でしょうか?
tatsumi-1

2018/11/16 06:23

実際には経由します.今回はデータが多いのでfor文を回すときに時間を短くするため経由地を2箇所にしています.
guest

回答1

0

とりあえず、こんな感じでどうでしょう。

Python

1import pandas as pd 2 3df = pd.DataFrame([[1,'大阪','東京'], 4 [1,'東京','北海道'], 5 [1,'北海道','大阪'], 6 [2,'大阪','福岡'], 7 [2,'福岡','大阪']], 8 columns=['旅行者','出発地','目的地']) 9 10grouped_df = df.groupby('旅行者') 11departure_df = grouped_df['出発地'].apply(lambda d:d.reset_index(drop=True)).unstack() 12arrival_df = grouped_df['目的地'].apply(lambda d: d.iat[-1]) 13 14result = departure_df.join(arrival_df) 15result.columns = ['出発地', '経由地1', '経由地2', '到着地'] 16print(result) 17# 出発地 経由地1 経由地2 到着地 18#旅行者 19#1 大阪 東京 北海道 大阪 20#2 大阪 福岡 None 大阪

【追記】

ループを使う方法

Python

1import pandas as pd 2 3df = pd.DataFrame([[1,'大阪','東京'], 4 [1,'東京','北海道'], 5 [1,'北海道','大阪'], 6 [2,'大阪','福岡'], 7 [2,'福岡','大阪']], 8 columns=['旅行者','出発地','目的地']) 9 10max_trip_size = df.groupby('旅行者').size().max() 11 12df1 = pd.DataFrame(columns=range(max_trip_size + 1)) 13for member,d in df.groupby('旅行者'): 14 # 出発地+経由地を追加 15 df1 = df1.append(d['出発地'].reset_index(drop=True).rename(member)) 16 # 到着地を追加 17 df1.loc[member, max_trip_size] = d['目的地'].iat[-1] 18 19# カラム名を修正 20df1 = df1.add_prefix('経由地') 21df1 = df1.rename(columns={'経由地0':'出発地', '経由地{}'.format(max_trip_size):'到着地'}) 22print(df1) 23# 出発地 経由地1 経由地2 到着地 24#1 大阪 東京 北海道 大阪 25#2 大阪 福岡 NaN 大阪

投稿2018/11/15 11:53

編集2018/11/16 07:21
magichan

総合スコア15898

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

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

tatsumi-1

2018/11/16 03:50

回答ありがとうふございます. 実際には旅行者がかなり多くいるので最初のdfのデータからデータフレームに代入していく方法が知りたいです.
magichan

2018/11/16 07:23

とりあえずループ処理にてデータを追記していく方法を記載しました。 > 実際には旅行者がかなり多くいるので であればなおさらループ使わないほうがよいと個人的には思うのですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問