gpt4 book ai didi

python - 多索引 Pandas DataFrame 中的顺序排序

转载 作者:太空宇宙 更新时间:2023-11-03 16:35:19 26 4
gpt4 key购买 nike

我有一个多索引的 Pandas 数值数据框。我希望使用数据的其他两个子集对数据帧子集中的每一行进行顺序排序。我相信下面的例子可以更好地说明我的需要:

考虑这个示例数据集:

                         A          B          C          D
rtr 2015-01-31 -1.085631 -0.204201 1.730024 1.710438
2015-02-28 0.997345 1.979348 1.232650 -0.056341
key1 2015-01-31 6.180000 0.990000 2.440000 1.920000
2015-02-28 1.140000 1.810000 4.560000 0.740000
key2 2015-01-31 86.000000 36.000000 61.000000 34.000000
2015-02-28 97.000000 96.000000 48.000000 98.000000

考虑日期 2015-02-28key1key2rtr 的最后几行:

  1. df.loc['key1']中,获取2个最大值的列名。 (即:C、B)
  2. 从列空间中排除 C 列和 B 列。 (即:剩余列数:A、D)
  3. df.loc['key2']中,获取剩余列空间中最大值的列名。 (即:在 A 列和 D 列中的值中,D 较大 -> 返回 D)
  4. df.loc['rtr'] 中获取与步骤 1 和 3 中找到的列名称相对应的值(即:返回值 df.loc['rtr'] .loc['20150228',['C','B','D']]
In [140]: df.loc['rtr'].loc['20150228',['C','B','D']]
Out[140]:
C 1.232650
B 1.979348
D -0.056341
Name: 2015-02-28 00:00:00, dtype: float64

数据生成示例代码:

## generate data:
d1,d2,d3 = {},{},{}
np.random.seed(123)
for col in list("ABCD"):
d1[col] = np.random.randn(2)
d2[col] = np.random.gamma(2,3,2).round(2)
d3[col] = np.random.random_integers(0,100, 2)
t_index = pd.date_range(start = '2015-01-31', periods = 2, freq = "M")

dat1 = pd.DataFrame(d1, index = t_index)
dat2 = pd.DataFrame(d2, index = t_index)
dat3 = pd.DataFrame(d3, index = t_index)

df = pd.concat([dat1, dat2, dat3], keys = ['rtr', 'key1', 'key2'])

最佳答案

第 1 步:解决给定日期的问题。

df1 = df.xs('2015-01-31', level=1)

columns = df1.loc['key1'].nlargest(2).index.tolist()
columns.append(df1.loc['key2'][df.columns.difference(columns)].idxmax())
df1.loc['rtr', columns]

我们使用nlargest并获取结果的索引,因为idxmax仅适用于一个最大值。在排除之前带有 pandas 索引 difference 的列之后,我们在下面的行中使用 idxmax 。方法。

第 2 步:使用 groupby 将上述解决方案分别应用于每个日期。

def func(df2):
df1 = df2.reset_index(level=1, drop=True)
columns = df1.loc['key1'].nlargest(2).index.tolist()
columns.append(df1.loc['key2'][df.columns.difference(columns)].idxmax())
return df1.loc['rtr', columns]

df.groupby(level=1).apply(func)

添加reset_index是因为,与xs相比,groupby不会降低索引级别。

关于python - 多索引 Pandas DataFrame 中的顺序排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37280533/

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