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

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

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

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

pandas

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

Q&A

解決済

2回答

1199閲覧

1つのデータが2行で構成されているxlsxを、pandasで編集し1データ1行としたい

Hiroms

総合スコア17

Python

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

pandas

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

0グッド

1クリップ

投稿2018/10/29 15:30

編集2018/10/30 22:56

下記のように、エクセルファイルにて2行1データとなっているものを、1行1データに編集したいです。
元データ

イメージ説明

試したこと

pandasで、元データを「奇数行」と「偶数行」のデータフレームに分割。
その後、「奇数行df」へ「偶数行df」の列を挿入しようと考えましたが
方法がよくわかりません。

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

python3.6
pandas0.23

###追加情報
下記のようなコードで、ある程度やりたいことはできました。
が、かなり無理やりな気がします。もう少しスマートなコード記述はできないか
ご教授いただけると勉強になります。

Python

1import pandas as pd 2 3#あらかじめ、元データを'test1.xlsx'で作成済み 4df = pd.read_excel('test1.xlsx', sheet_name=0, header=0) 5 6#奇数行 7df_odd = df[::2] 8#不要行、列を削除 9df_odd_drop =df_odd.drop(index=0, columns='都道府県') 10#列名を修正 11df_odd_drop_r = df_odd_drop.rename(columns={'平成22年人口、順位': '平成22年人口', '人口密度、順位': '人口密度'}) 12 13#偶数行 14df_even = df[1::2] 15#列名を修正 16df_even_r = df_even.rename(columns={'平成22年人口、順位': '人口順位', '人口密度、順位': '人口密度順位'}) 17 18#indexのリセット 19df_odd_drop_r_r = df_odd_drop_r.reset_index(drop=True) 20df_even_r_r = df_even_r.reset_index(drop=True) 21 22# インデックスでマージ 23df3 = pd.concat( [df_odd_drop_r_r, df_even_r_r], axis=1) 24 25#列の並び替え 26df3_ix = df3.ix[:,['都道府県', '平成22年人口', '人口順位', '人口密度', '人口密度順位']] 27 28#結果の出力 29df3_ix.to_excel('df3.xlsx') 30 31 32#以下出力結果 33 都道府県 平成22年人口 人口順位 人口密度 人口密度順位 340 東京 13159.0 1.0 6168.7 1.0 351 大阪 8865.0 3.0 4639.8 2.0 362 神奈川 9048.0 2.0 3777.7 3.0 373 埼玉 7195.0 5.0 1913.4 4.0 384 愛知 7411.0 4.0 1446.7 5.0 395 千葉 6216.0 6.0 1206.5 6.0 406 福岡 5072.0 9.0 1023.1 7.0 417 兵庫 5588.0 7.0 658.8 8.0 428 沖縄 1393.0 20.0 628.4 9.0 439 京都 2636.0 13.0 566.0 10.0

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

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

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

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

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

magichan

2018/10/29 23:19

とりあえずpandas にてそのようなパラメーターを設定してデータを読み込み、その結果どの様なdataframeが得られたのかを記述して頂けないでしょうか。
Hiroms

2018/10/30 11:20

回答ありがとうございます。私ができたところまでのコードを質問に追記しました。
guest

回答2

0

ベストアンサー

質問のコードでそれほど問題があるとは思いませんが・・。

とりあえず

  • 不要な行(1行目)は read_excel()skiprows=[1] パラメータを渡す事で読み込まなくなります
  • 順位列の型が float となっているので uint に修正したほうが良いのでは
  • 結合時のKeyはIndexをコネコネするよりも"都道府県"でやったほうが楽

かと思いますので修正してみました

import pandas as pd #あらかじめ、元データを'test1.xlsx'で作成済み df = pd.read_excel('test1.xlsx', sheet_name=0, header=0, skiprows=[1]) # 奇数行の"都道府県"列を埋める(上の行の値で埋める) df = df.fillna(method='ffill') #偶数行のカラム名変更&型変更) df_even = df[::2].rename(columns={'平成22年人口、順位': '人口順位', '人口密度、順位': '人口密度順位'}).astype({'人口順位':'uint', '人口密度順位':'uint'}) #奇数行のカラム名変更 df_odd = df[1::2].rename(columns={'平成22年人口、順位': '平成22年人口', '人口密度、順位': '人口密度'}) # 都道府県でマージ df3 = pd.merge(df_even, df_odd, on='都道府県') #列の並び替え df3_ix = df3.ix[:,['都道府県', '平成22年人口', '人口順位', '人口密度', '人口密度順位']] #結果の出力 df3_ix.to_excel('df3.xlsx')

投稿2018/10/31 00:22

magichan

総合スコア15898

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

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

Hiroms

2018/10/31 14:03

修正いただいたコードで目的のものができました。また、ご教授いただいた点、大変勉強になりました。ありがとうございました。
guest

0

奇数、偶数行で別テーブルに分割し結合するコード例です。
Excel操作、(数値にカンマが含まれているなら)カンマの除去など細かい処理はご自身で実装ください。

Python

1import pandas as pd 2df = pd.DataFrame( {'県':['埼玉','','愛知','','千葉',''],'人口':[3,11,2,22,1,33],'密度':[1,333,2,222,3,111]}) 3print(df) 4 5# 奇数、偶数行で別テーブルに分割、列名の調整、インデックスの再振替、奇数行は県は空白なので不要 6df1 = df.query('index % 2 == 0').rename(columns={'人口':'人口順位','密度':'密度順位'}).reset_index(drop=True) 7df2 = df.query('index % 2 == 1').rename(columns={'人口':'人口値','密度':'密度値'}).reset_index(drop=True).drop('県', axis=1) 8print(df1) 9print(df2) 10 11# インデックスでマージ 12df3 = pd.concat( [df1, df2], axis=1) 13print(df3) 14""" 15 人口順位 密度順位 県 人口値 密度値 160 3 1 埼玉 11 333 171 2 2 愛知 22 222 182 1 3 千葉 33 111 19"""

参考:
pandas.DataFrameの行を条件で抽出するquery
DataFrameを横方向に結合する concat、merge、join-python

投稿2018/10/30 09:09

編集2018/10/30 09:10
can110

総合スコア38234

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

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

Hiroms

2018/10/31 14:06

回答ありがとうございます。例えば、「df1の2列目にdf2の2列目を追加」ということができないかと考えていましたが、concatでマージした後列を並び替えればいいのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問