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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

pandas

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

Q&A

解決済

1回答

245閲覧

pandas:階層型インデックスのあるデータフレームの計算

ak_miyamoto

総合スコア31

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

pandas

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

0グッド

1クリップ

投稿2018/01/05 12:45

編集2018/01/05 12:47

環境:Python3.6 win10

初学者です。階層型インデックスのあるデータフレームと、もう1つのデータフレームの2つを用いて計算したいと考えています。
具体的には、

data1(階層インデックスあり)

id1id2value1value2value3value4
Aa15340
Ab52124
Ba62134
Bb12014
Bc71234
Ca122743
Cb82389
Da2254
...
Za2345
Zb9876

data2(data1と共通のid1のみ存在)

id1value1value2value3value4
A253442
B3623314
C122373
D26158
Z0113

があったときに,「data1の値からdata2の値を引く。ただし計算は、id1に紐づけて行う(id2の数に関わらず、id1が同じ行は同じものとみなす)」という作業をしたいと考えております。
以下のような計算結果が欲しいです。

data3

id1id2value1value2value3value4
Aa1-25-533-440-42
Ab5-22-5312-44-42
Ba6-3621-23-334-14
Bb1-362-20-3314-14
Bc7-3612-23-334-14
Ca1-1222-27-3743-3
Cb8-122-23-3789-3
Da2-22-615-54-8
...
Za2-03-14-15-3
Zb9-08-17-16-3

付帯情報
0. data1とdata2のカラムの数(valueの数)は共通です。

  1. data1:id1(A,B,C…)あたりのid2の数は一定ではありません。また実際には、id1はアルファベットで表現できないほど沢山あります。
  2. data2:id1の数はdata1と共通です。

Python3

1data2.sub(data1)

といった方法を使うのかとも考えたのですが、いまいちよくわからない状況です。pandasかNumpyであればどのような方法でも構いません。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえず2通り書いてみました。

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

下記のようなデータにおいて

Python

1import pandas as pd 2idx = pd.MultiIndex.from_arrays([['A','A','B','B','B','C','C','D'], 3 ['a','b','a','b','c','a','b','a']]) 4df1 = pd.DataFrame([[1,5,3,40], 5 [5,2,12,4], 6 [6,21,3,4], 7 [1,2,0,14], 8 [7,12,3,4], 9 [1,22,7,43], 10 [8,2,3,89], 11 [2,2,5,4]], 12 index=idx, 13 columns=['value1','value2','value3','value4']) 14 15df2 = pd.DataFrame([[2,53,4,42], 16 [36,2,33,14], 17 [12,2,37,3], 18 [2,61,5,8]], 19 index=['A','B','C','D'], 20 columns=['value1','value2','value3','value4'])

(1) ループを使う

Python

1for idx, row in df1.iterrows(): 2 df1.loc[idx] = row.sub(df2.loc[idx[0]]) 3print(df1)

(2) Apply()を使う

Python

1df1 = df1.apply(lambda d:d.sub(df2.loc[d.name[0]]), axis=1) 2print(df1)

投稿2018/01/05 17:04

magichan

総合スコア15898

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

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

ak_miyamoto

2018/01/08 00:47

うまくいきました!ありがとうございます。また、クリップして下さった方もありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問