0
点赞
收藏
分享

微信扫一扫

尝试使用 apply 函数来对 DataFrame 的每一行进行操作,并期望返回的结果不被转置。然而,当 apply 函数的结果是一个 Series 时,Pandas 会自动将结果转置。这是因为 Pa

晒大太阳了 2024-02-06 阅读 11

import pandas as pd

# 传入ser/arg, df/args
# 输出arg/ser, args/df
def main() -> None:
    df = pd.DataFrame([[1, 2], [3, 4]])
    res = pd.DataFrame(columns=["a", "b"])

    # 传入ser, 输出arg
    # df.iloc[:, 0].map(lambda x: print(x))

    # 输出args, series.map不支持对行操作, 结果转置
    # res[["a", "b"]] = df.iloc[:, 0].map(lambda x: aid(*[x]))
    # print(res)

    # 传入df, 输出arg
    # df.apply(lambda x: print(x), axis=1)

    # 输出args, 对传入指定行操作, 但结果仍然转置
    res[["a", "b"]] = df.apply(lambda x: aid(*x), axis=1)
    print(res)

    # 总结, 输出args 会导致错误转置

def aid(*args):
    print(args)
    lis = [j * 10 ** i for i, j in enumerate(args, start=1)]
    return lis[0], lis[-1]

if __name__ == '__main__':
    main()

你的代码中,你尝试使用 apply 函数来对 DataFrame 的每一行进行操作,并期望返回的结果不被转置。然而,当 apply 函数的结果是一个 Series 时,Pandas 会自动将结果转置。这是因为 Pandas 设计的初衷是让每一列代表一个变量,每一行代表一个观察值。

如果你希望避免这种转置,你可以在 aid 函数中直接返回一个 Pandas Series,而不是一个元组。这样,apply 函数就会将每一行的结果组合成一个新的 DataFrame,而不是转置它们。以下是修改后的代码:

import pandas as pd

def main() -> None:
    df = pd.DataFrame([[1, 2], [3, 4]])
    res = df.apply(aid, axis=1)
    print(res)

def aid(x):
    lis = [j * 10 ** i for i, j in enumerate(x, start=1)]
    return pd.Series(lis)

if __name__ == '__main__':
    main()

在这个修改后的代码中,aid 函数现在返回一个 Pandas Series,其中每个元素都是 lis 列表中的一个元素。这样,apply 函数就会将这些 Series 组合成一个新的 DataFrame,而不是转置它们。希望这个修改能解决你的问题。如果你还有其他问题,欢迎随时向我提问。😊

举报

相关推荐

0 条评论