Pandas:如何选择按键分组的一系列行的最小值

时间:2017-02-01 03:15:45

标签: python pandas data-cleaning

假设我有以下数据框:

Key | Amount | Term   | Other | Other_2
----+--------+--------+-------+--------
A   |   9999 | Short  | ABC   | 100
A   |    261 | Short  | ABC   | 100
B   |    281 | Long   | CDE   | 200
C   |    140 | Long   | EFG   | 300
C   |   9999 | Long   | EFG   | 300

所需的输出应为:

Key | Amount | Term   | Other | Other_2
----+--------+--------+-------+--------
A   |    261 | Short  | ABC   | 100
B   |    281 | Long   | CDE   | 200
C   |    140 | Long   | EFG   | 300

也就是说,取“Amount”列的min,同时保留行中最小值的其余值。

我认为这可以通过groupby()来完成,但我不会想象如何。

编辑:我删除了逗号,我的数据是数字

1 个答案:

答案 0 :(得分:1)

要获取每个键中的最小值,可以使用df[df.Amount.groupby(df.Key).apply(lambda x: x == x.min())] # Key Amount Term Other Other_2 #1 A 261 Short ABC 100 #2 B 281 Long CDE 200 #3 C 140 Long EFG 300 创建一个布尔系列,其中min值为true,其他值为false;然后你可以使用布尔系列进行子集化:

nsmallest()

您可以在每个子组上使用Amount方法的另一个选项,在这里您可以选择df.groupby("Key", group_keys=False).apply(lambda g: g.nsmallest(1, "Amount")) # Key Amount Term Other Other_2 #1 A 261 Short ABC 100 #2 B 281 Long CDE 200 #3 C 140 Long EFG 300 排序的最小行:

import math

def permute(a, l, r, p):
if l == r:
    p.append(a)
    print(a)
else:
    for i in range(l, r + 1):
        a[l], a[i] = a[i], a[l]
        permute(a, l + 1, r, p)
        a[l], a[i] = a[i], a[l]  # Backtrack
return p


n = 1347
size = math.floor(math.log(n, 10))

a = list(map(int, str(n)))

permutations = permute(a, 0, size, [])

print("------")
print(permutations)