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']

(我使用的是 pandas 0.11.0,但我也在 0.12.0-1100-g0c30665 上进行了检查。)

4

1 回答 1

13

您可以将result_type参数设置apply为“减少”。

文档中,

默认情况下(result_type=None),最终返回类型是从应用函数的返回类型推断出来的。否则,它取决于 result_type 参数。

接着,

'reduce' :如果可能,返回一个系列,而不是扩展类似列表的结果。这与“扩展”相反。

在您的代码中,在此处更新:

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, result_type='reduce')
于 2020-06-08T16:34:22.753 回答