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,而不是转置它们。希望这个修改能解决你的问题。如果你还有其他问题,欢迎随时向我提问。😊