1. ホーム
  2. python

[解決済み] pandasのapply関数で行のインデックスを取得する

2022-05-01 21:38:50

質問

ある行のインデックスにアクセスしようとしています。 DataFrame をPandasで作成しました。私はこのようなものを持っています。

df = pandas.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'])
>>> df
   a  b  c
0  1  2  3
1  4  5  6

そして、指定された行の要素にアクセスする関数を定義します。

def rowFunc(row):
    return row['a'] + row['b'] * row['c']

こんな風に適用できるんです。

df['d'] = df.apply(rowFunc, axis=1)
>>> df
   a  b  c   d
0  1  2  3   7
1  4  5  6  34

すげえええええええええええええええええええええええええ では、インデックスを関数に組み込む場合はどうすればいいのでしょうか? この関数内の任意の行のインデックスを DataFrame を追加する前に d となります。 Index([u'a', u'b', u'c', u'd'], dtype='object') しかし、私は0と1が欲しいのです。 row.index .

インデックスを格納するテーブルに一時的なカラムを作ればいいのは分かっているのですが、行オブジェクトのどこかに格納されているのではと思います。

どのように解決するのですか?

この場合、インデックスにアクセスするために name 属性で指定します。

In [182]:

df = pd.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'])
def rowFunc(row):
    return row['a'] + row['b'] * row['c']

def rowIndex(row):
    return row.name
df['d'] = df.apply(rowFunc, axis=1)
df['rowIndex'] = df.apply(rowIndex, axis=1)
df
Out[182]:
   a  b  c   d  rowIndex
0  1  2  3   7         0
1  4  5  6  34         1

もし、本当にこのようなことをしようとしているのであれば、以下の方法が有効であり、より高速であることに注意してください。

In [198]:

df['d'] = df['a'] + df['b'] * df['c']
df
Out[198]:
   a  b  c   d
0  1  2  3   7
1  4  5  6  34

In [199]:

%timeit df['a'] + df['b'] * df['c']
%timeit df.apply(rowIndex, axis=1)
10000 loops, best of 3: 163 µs per loop
1000 loops, best of 3: 286 µs per loop

EDIT

3年以上経ってからこの質問を見ると、そうすればいいんじゃないでしょうか。

In[15]:
df['d'],df['rowIndex'] = df['a'] + df['b'] * df['c'], df.index
df

Out[15]: 
   a  b  c   d  rowIndex
0  1  2  3   7         0
1  4  5  6  34         1

が、これほど些細なことではないと仮定すると、どんなものであれ、あなたの rowFunc が本当にやっていることは、ベクトル化された関数を使うことであり、それをdfインデックスに対して使うことです。

In[16]:
df['newCol'] = df['a'] + df['b'] + df['c'] + df.index
df

Out[16]: 
   a  b  c   d  rowIndex  newCol
0  1  2  3   7         0       6
1  4  5  6  34         1      16