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

标签 python sorting pandas set

我有一个多索引的 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/

相关文章:

python-3.x - 从两个不完整的、大小不同的数据帧创建日期数据帧

c# - 如何在数组中找到最大值

python - 将数据帧写入mysql数据库

python - Django 外键查询集(加入)

python - 在 Django JSONField 中过滤列表项

Python modbus 通信使用 ModbusTcpClient 库在三菱 PLC 上读取单词

python - 如何为环境禁用 `site.ENABLE_USER_SITE`?

iphone - 如何使用字母数字值对数组进行排序?

java - 反转排序算法

python-3.x - 如何将 Pandas 数据帧写入 HDF5 数据集