pandas 如何在Dataframe中按一定条件对数据进行排序?

a1o7rhls  于 2023-04-04  发布在  其他
关注(0)|答案(4)|浏览(143)

给定近似数据框

df = pd.DataFrame({
    'Name': ['Max', 'Stefan', 'John', 'Kate', 'Walter', 'Karin', 'Julia', 'Ben', 'Spencer'],
    'Balance': [0.12, 0.03, 0.12, 0.12, 0.12, 0.03, 0.03, 0.06, 0.03]})

      Name  Balance
0      Max     0.12
1   Stefan     0.03
2     John     0.12
3     Kate     0.12
4   Walter     0.12
5    Karin     0.03
6    Julia     0.03
7      Ben     0.06
8  Spencer     0.03

排序的条件是按3行创建迷你组。这些行将是:第一个(列的最大值),第二个(小于最大值且大于最小值的值),第三个(列的最小值)。但细微差别是,这个值(第二个)可以等于最大值或等于最小值,或者只是max〉average〉min。此外,重要的是要注意,所有值都可以相等。因此可能有四种不同的结果。
我需要以这样的方式对这个Dataframe进行排序:

Name  Balance
0      Max     0.12
1      Ben     0.06
2    Julia     0.03
3     Kate     0.12
4   Walter     0.12
5    Karin     0.03
6     John     0.12
7   Stefan     0.03
8  Spencer     0.03
eh57zj3b

eh57zj3b1#

您可以先按余额排序,为订单创建一个额外的列,并使用它来重新排序 Dataframe :

df.sort_values('Balance', ascending=False, inplace=True)

df['Order'] = sum((list(range(i, len(df), 3)) for i in range(3)), [])

df.sort_values('Order', inplace=True)

del df['Order']

结果:

Name  Balance
0      Max     0.12
4   Walter     0.12
5    Karin     0.03
2     John     0.12
7      Ben     0.06
6    Julia     0.03
3     Kate     0.12
1   Stefan     0.03
8  Spencer     0.03
0md85ypi

0md85ypi2#

你的问题中有太多的细微差别,无法正确回答,但这可能会给予你类似的东西:

max_mask = df.Balance.eq(df.Balance.max())
min_mask = df.Balance.eq(df.Balance.min())
max_vals = df[max_mask]
min_vals = df[min_mask]
other = df[~max_mask & ~min_mask].sort_values(by='Balance', ascending=False)

output = pd.concat([
    out.reset_index(drop=True) for out in (max_vals, other, min_vals)
]).sort_index()

print(output)

输出:

Name  Balance
0      Max     0.12
0      Ben     0.06
0   Stefan     0.03
1     John     0.12
1    Karin     0.03
2     Kate     0.12
2    Julia     0.03
3   Walter     0.12
3  Spencer     0.03
piv4azn7

piv4azn73#

该算法考虑第一个3行组([0,1,2])然后对内部数据进行排序,因此第二个3行组([3,4,5])并对数据进行排序,等等。
升序设置为False
可以使用N参数进行泛化。

建议稿

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Name': ['Max', 'Stefan', 'John', 'Kate', 'Walter', 'Karin', 'Julia', 'Ben', 'Spencer'],
    'Balance': [0.12, 0.03, 0.12, 0.12, 0.12, 0.03, 0.03, 0.06, 0.03]})

N=3
r = (df.groupby(np.arange(len(df.index))//N, axis=0)
       .apply(lambda g: g.sort_values(by='Balance', ascending=False))
       .reset_index(drop=True)
       )

print(r)

结果

Name  Balance
0      Max     0.12
1     John     0.12
2   Stefan     0.03
3     Kate     0.12
4   Walter     0.12
5    Karin     0.03
6      Ben     0.06
7    Julia     0.03
8  Spencer     0.03
zbdgwd5y

zbdgwd5y4#

试试这个:

df = pd.DataFrame({
    'Name': ['Max', 'Stefan', 'John', 'Kate', 'Walter', 'Karin', 'Julia', 'Ben', 'Spencer'],
    'Balance': [0.12, 0.03, 0.12, 0.12, 0.12, 0.03, 0.03, 0.06, 0.03]})

groups = []
while not df.empty:
    max_idx, min_idx = df['Balance'].idxmax(), df['Balance'].idxmin()
    if (between_min_max := df['Balance'].between(
        *df['Balance'].loc[min_idx, max_idx], inclusive='neither')).any():

        mid_idx = between_min_max.idxmax()

    else:
        mid_idx = df['Balance'].drop(index=[max_idx, min_idx]).idxmax()
    
    group = df.loc[[max_idx, mid_idx, min_idx]]    
    data.append(group)    
    df.drop(index=group.index, inplace=True)

result = pd.concat(groups)
print(result)
>>>
      Name  Balance
0      Max     0.12
7      Ben     0.06
1   Stefan     0.03
2     John     0.12
3     Kate     0.12
5    Karin     0.03
4   Walter     0.12
8  Spencer     0.03
6    Julia     0.03

相关问题