gpt4 book ai didi

python - Pandas 无法在转置 DataFrame 上使用 Apply

转载 作者:行者123 更新时间:2023-12-01 04:12:03 25 4
gpt4 key购买 nike

我有一个简单的功能:

def f(returns):
base = (1 + returns.sum()) / (1 + returns).prod()
base = pd.Series([base] * len(returns))
exp = returns.abs() / returns.abs().sum()

return (1 + returns) * base.pow(exp) - 1.0

和一个数据框:

df = pd.DataFrame([[.1,.2,.3],[.4,.5,.6],[.7,.8,.9]], columns=['A', 'B', 'C'])

我可以做到这一点:

df.apply(f)

A B C
0 0.084169 0.159224 0.227440
1 0.321130 0.375803 0.426375
2 0.535960 0.567532 0.599279

但是,换位:

df.transpose().apply(f)

产生意想不到的结果:

    0   1   2
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
A NaN NaN NaN
B NaN NaN NaN
C NaN NaN NaN

现在,我可以手动转置 DataFrame:

df2 = pd.DataFrame([[1., 4., 7.],[2., 5., 8.], [3., 6., 9.]], columns=['A', 'B', 'C'])
df2.apply(f)

A B C
0 0.628713 1.516577 2.002160
1 0.989529 1.543616 1.936151
2 1.160247 1.499530 1.836141

我不明白为什么我不能简单地转置然后将函数应用到 DataFrame 的每一行。事实上,我也不知道为什么我不能这样做:

df.apply(f, axis=1)

0 1 2 A B C
0 NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN

最佳答案

正如 EdChum 所说,问题是 pandas 试图将您在 f 中创建的 Series 的索引与 DataFrame 的索引对齐。这恰好适用于您的第一个示例,因为您没有在 Series 调用中指定索引,因此它使用默认的 0, 1, 2,这恰好是和你原来的DF一样。如果你原来的 DF 有其他索引,它会立即失败:

>>> df = pd.DataFrame([[.1,.2,.3],[.4,.5,.6],[.7,.8,.9]], columns=['A', 'B', 'C'], index=[8, 9, 10])
>>> df.apply(f)
A B C
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
8 NaN NaN NaN
9 NaN NaN NaN
10 NaN NaN NaN

要修复此问题,请显式创建与 DF 具有相同索引的新系列。将 d 内的行更改为:

base = pd.Series([base] * len(returns), index=returns.index)

然后:

>>> df.apply(f)
A B C
8 0.084169 0.159224 0.227440
9 0.321130 0.375803 0.426375
10 0.535960 0.567532 0.599279
>>> df.T.apply(f)
8 9 10
A 0.087243 0.293863 0.453757
B 0.172327 0.359225 0.505245
C 0.255292 0.421544 0.553746

关于python - Pandas 无法在转置 DataFrame 上使用 Apply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34797323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com