为什么pandas.DataFrame.apply设置axis=1时返回Series而非DataFrame
核心原因
pandas的apply返回类型由传入函数的返回值形式、axis参数共同决定:
- 当
axis=1(逐行处理)时,每次传入函数的是代表单行的一维Series,你定义的plus_2返回的是普通Python列表,pandas会将这个列表识别为单个元素,最终所有行的返回元素会拼接成一个Series,长度和原DataFrame行数一致。 - 当
axis=0(逐列处理)时,每次传入函数的是代表单列的一维Series,返回的列表长度和原列长度(即原DataFrame行数)一致,pandas会自动将每列的返回结果作为新列,最终拼接为DataFrame。
让axis=1也返回DataFrame的方案
方案1:修改函数返回值为pandas Series
函数返回时指定为Series并匹配原行的index,pandas会自动将每行返回的Series拼成DataFrame:
import pandas as pd df = pd.DataFrame([[4,9]]*3, columns = ["A", "B"]) def plus_2(x): y =[] for i in range(0, len(x)): y.append(x[i]+2) return pd.Series(y, index=x.index) df_row = df.apply(plus_2, axis = 1)
方案2:对apply结果做二次转换
不需要修改原函数,直接将apply返回的Series的元素展开为DataFrame:
df_row = pd.DataFrame(df.apply(plus_2, axis=1).tolist(), columns=df.columns)
内容的提问来源于stack exchange,提问作者G.T.
相关产品推荐
相关产品推荐

