将公式应用于多索引列 Python
Apply formula to Multi-index column Python
预先感谢您的帮助。
足够新 pandas 是危险的。
想要将公式和标签结果应用于多索引数据框。
以下作品:
import pandas as pd
import numpy as np
N = 100
dates = pd.date_range('19971002', periods=N, freq='B')
df =pd.DataFrame(np.random.randn(len(dates),2),index=dates,columns=list('AB'))
df1 =pd.DataFrame(np.random.randn(len(dates),2),index=dates,columns=list('AB'))
我添加了两列,'pattern'(用于标签)和 'delta'(公式)。
df['pattern'] = 'foo'
df['delta'] = df.A - df.B
df.loc[(df.A > df.B),'pattern']= 'bar'
df.loc[(df.A < df.B),'pattern'] = 'bat'
df.head()
A B pattern delta
1997-10-02 -0.685254 2.264847 bat -2.950101
1997-10-03 -1.087783 1.953508 bat -3.041291
1997-10-06 1.094727 0.612298 bar 0.482429
1997-10-07 -1.093363 1.791276 bat -2.884639
1997-10-08 -0.916725 2.225537 bat -3.142262
我在连接两个数据帧时遇到了麻烦。想要将 df 和 df1 合并到单个数据框中,以便我可以获得 'bar' 和 'bat' 的最高值,以及标识数据(行)是来自 DF 还是来自 DF1 的附加列。
data = pd.DataFrame(pd.concat([df, df1], axis=1, keys=['DF', 'DF1']))
df.head()
DF DF1
A B A B
1997-10-02 0.360254 -0.477511 -0.017894 0.226474
1997-10-03 -0.226963 -1.302804 -1.615174 -0.330607
1997-10-06 0.524860 2.597518 -0.041241 1.432354
1997-10-07 -0.672445 1.741740 0.011852 0.013495
1997-10-08 0.969295 0.240990 0.682385 0.875781
我试过几种方法,例如:
data['value'] = 'foo'
data['delta'] = data.A - data.B
data.loc[(data.A > data.B),'pattern']= 'bar'
data.loc[(data.A < data.B),'pattern'] = 'bat'
并获取错误消息。
直觉告诉我我需要分组然后应用公式,我可以处理(我认为),但我如何携带标签('pattern')?
目标是:
Column pattern delta
1997-10-02 DF bat -2.950101
1997-10-03 DF bat -3.041291
1997-10-06 DF1 bar 0.482429
1997-10-07 DF bat -2.884639
1997-10-08 DF1 bat -3.142262
再次感谢您!
IIUC,你可以简单地通过堆叠然后进行 groupby 来完成大部分工作:
data = data.stack(level=0)
data['pattern'] = 'foo'
data['delta'] = data.A - data.B
data.loc[(data.A > data.B),'pattern']= 'bar'
data.loc[(data.A < data.B),'pattern'] = 'bat'
final = data.loc[data.groupby(level=0)["delta"].idxmax()]
给我类似的东西
>>> final
A B pattern delta
1997-10-02 DF 0.536219 -1.019708 bar 1.555927
1997-10-03 DF 1.702837 -1.204639 bar 2.907477
1997-10-06 DF1 0.448117 0.302420 bar 0.145697
1997-10-07 DF -0.563475 0.778225 bat -1.341700
1997-10-08 DF 1.072564 0.695792 bar 0.376772
1997-10-09 DF 0.739936 -0.290353 bar 1.030290
1997-10-10 DF1 -0.124411 0.351603 bat -0.476014
1997-10-13 DF1 -0.390445 -0.208104 bat -0.182341
1997-10-14 DF1 -0.153270 -1.464505 bar 1.311235
1997-10-15 DF1 0.081881 -1.382577 bar 1.464458
您可以在其中重置索引并根据需要更改列名。这是可行的,因为堆叠将列中的 DF 拉出:
>>> data.stack(level=0)
A B
1997-10-02 DF 0.060752 -0.858375
DF1 0.923508 -1.188595
1997-10-03 DF -0.820430 -1.964643
DF1 -0.989516 -0.916772
[...]
最后,因为 .idxmax()
给了我们 delta
达到最大值的索引,我们可以用它来索引帧。
旁白:这是个人偏好,但我喜欢使用 np.sign
(1 表示正数,0 表示 0,-1 表示负数)然后 replace
而不是三行 pattern
翻译。例如:
np.sign(data["delta"]).replace({1: "bar", 0: "foo", -1: "bat"})
预先感谢您的帮助。
足够新 pandas 是危险的。
想要将公式和标签结果应用于多索引数据框。
以下作品:
import pandas as pd
import numpy as np
N = 100
dates = pd.date_range('19971002', periods=N, freq='B')
df =pd.DataFrame(np.random.randn(len(dates),2),index=dates,columns=list('AB'))
df1 =pd.DataFrame(np.random.randn(len(dates),2),index=dates,columns=list('AB'))
我添加了两列,'pattern'(用于标签)和 'delta'(公式)。
df['pattern'] = 'foo'
df['delta'] = df.A - df.B
df.loc[(df.A > df.B),'pattern']= 'bar'
df.loc[(df.A < df.B),'pattern'] = 'bat'
df.head()
A B pattern delta
1997-10-02 -0.685254 2.264847 bat -2.950101
1997-10-03 -1.087783 1.953508 bat -3.041291
1997-10-06 1.094727 0.612298 bar 0.482429
1997-10-07 -1.093363 1.791276 bat -2.884639
1997-10-08 -0.916725 2.225537 bat -3.142262
我在连接两个数据帧时遇到了麻烦。想要将 df 和 df1 合并到单个数据框中,以便我可以获得 'bar' 和 'bat' 的最高值,以及标识数据(行)是来自 DF 还是来自 DF1 的附加列。
data = pd.DataFrame(pd.concat([df, df1], axis=1, keys=['DF', 'DF1']))
df.head()
DF DF1
A B A B
1997-10-02 0.360254 -0.477511 -0.017894 0.226474
1997-10-03 -0.226963 -1.302804 -1.615174 -0.330607
1997-10-06 0.524860 2.597518 -0.041241 1.432354
1997-10-07 -0.672445 1.741740 0.011852 0.013495
1997-10-08 0.969295 0.240990 0.682385 0.875781
我试过几种方法,例如:
data['value'] = 'foo'
data['delta'] = data.A - data.B
data.loc[(data.A > data.B),'pattern']= 'bar'
data.loc[(data.A < data.B),'pattern'] = 'bat'
并获取错误消息。
直觉告诉我我需要分组然后应用公式,我可以处理(我认为),但我如何携带标签('pattern')?
目标是:
Column pattern delta
1997-10-02 DF bat -2.950101
1997-10-03 DF bat -3.041291
1997-10-06 DF1 bar 0.482429
1997-10-07 DF bat -2.884639
1997-10-08 DF1 bat -3.142262
再次感谢您!
IIUC,你可以简单地通过堆叠然后进行 groupby 来完成大部分工作:
data = data.stack(level=0)
data['pattern'] = 'foo'
data['delta'] = data.A - data.B
data.loc[(data.A > data.B),'pattern']= 'bar'
data.loc[(data.A < data.B),'pattern'] = 'bat'
final = data.loc[data.groupby(level=0)["delta"].idxmax()]
给我类似的东西
>>> final
A B pattern delta
1997-10-02 DF 0.536219 -1.019708 bar 1.555927
1997-10-03 DF 1.702837 -1.204639 bar 2.907477
1997-10-06 DF1 0.448117 0.302420 bar 0.145697
1997-10-07 DF -0.563475 0.778225 bat -1.341700
1997-10-08 DF 1.072564 0.695792 bar 0.376772
1997-10-09 DF 0.739936 -0.290353 bar 1.030290
1997-10-10 DF1 -0.124411 0.351603 bat -0.476014
1997-10-13 DF1 -0.390445 -0.208104 bat -0.182341
1997-10-14 DF1 -0.153270 -1.464505 bar 1.311235
1997-10-15 DF1 0.081881 -1.382577 bar 1.464458
您可以在其中重置索引并根据需要更改列名。这是可行的,因为堆叠将列中的 DF 拉出:
>>> data.stack(level=0)
A B
1997-10-02 DF 0.060752 -0.858375
DF1 0.923508 -1.188595
1997-10-03 DF -0.820430 -1.964643
DF1 -0.989516 -0.916772
[...]
最后,因为 .idxmax()
给了我们 delta
达到最大值的索引,我们可以用它来索引帧。
旁白:这是个人偏好,但我喜欢使用 np.sign
(1 表示正数,0 表示 0,-1 表示负数)然后 replace
而不是三行 pattern
翻译。例如:
np.sign(data["delta"]).replace({1: "bar", 0: "foo", -1: "bat"})