14

pandas DataFrame の apply() メソッドに問題があります。私の問題は、入力関数の戻り値の型に応じて、apply() が Series または DataFrame のいずれかを返すことができることです。ただし、フレームが空の場合、apply() (ほぼ) は常に DataFrame を返します。そのため、シリーズを期待するコードを書くことはできません。次に例を示します。

import pandas as pd

def area_from_row(row):
    return row['width'] * row['height']

def add_area_column(frame):
    # I know I can multiply the columns directly, but my actual function is
    # more complicated.
    frame['area'] = frame.apply(area_from_row, axis=1)

# This works as expected.
non_empty_frame = pd.DataFrame(data=[[2, 3]], columns=['width', 'height'])
add_area_column(non_empty_frame)

# This fails!
empty_frame = pd.DataFrame(data=None, columns=['width', 'height'])
add_area_column(empty_frame)

これに対処する標準的な方法はありますか?私は次のことを行うことができますが、それはばかげています:

def area_from_row(row):
    # The way we respond to an empty row tells pandas whether we're a
    # reduction or not.
    if not len(row):
        return None
    return row['width'] * row['height']

(パンダ0.11.0を使用していますが、0.12.0-1100-g0c30665でもこれを確認しました。)

4

1 に答える 1