我正试图操作我的数据帧,类似于使用SQL窗口函数。考虑以下样本集:

import pandas as pd

df = pd.DataFrame({'fruit' : ['apple', 'apple', 'apple', 'orange', 'orange', 'orange', 'grape', 'grape', 'grape'],
               'test' : [1, 2, 1, 1, 2, 1, 1, 2, 1],
               'analysis' : ['full', 'full', 'partial', 'full', 'full', 'partial', 'full', 'full', 'partial'],
               'first_pass' : [12.1, 7.1, 14.3, 19.1, 17.1, 23.4, 23.1, 17.2, 19.1],
               'second_pass' : [20.1, 12.0, 13.1, 20.1, 18.5, 22.7, 14.1, 17.1, 19.4],
               'units' : ['g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g'],
               'order' : [2, 1, 3, 2, 1, 3, 3, 2, 1]})

+--------+------+----------+------------+-------------+-------+-------+
|水果|测试|分析|第一个|通过|第二个|通过|顺序|单位|
+--------+------+----------+------------+-------------+-------+-------+
|苹果| 1 |全| 12.1 | 20.1 | 2 | g|
|苹果| 2 |全| 7.1 | 12.0 | 1 | g|
|苹果| 1 |部分| 14.3 | 13.1 | 3 | g|
|橙色| 1 |满| 19.1 | 20.1 | 2 | g|
|橙色| 2 |满| 17.1 | 18.5 | 1 | g|
|橙色| 1 |部分| 23.4 | 22.7 | 3 | g|
|葡萄| 1 |全| 23.1 | 14.1 | 3 | g|
|葡萄| 2 |全| 17.2 | 17.1 | 2 | g|
|葡萄| 1 |部分| 19.1 | 19.4 | 1 | g|
+--------+------+----------+------------+-------------+-------+-------+
我想添加几列:
一个布尔列,指示该测试和分析的第二个通过值是否在所有水果类型中最高。
另一列列出每个测试和分析组合的第二个通过值最高的水果。
使用这个逻辑,我想得到下表:
+--------+------+----------+------------+-------------+-------+-------+---------+---------------------+
|水果|测试|分析|第一|通过|第二|通过|顺序|单位|最高|最高|水果|
+--------+------+----------+------------+-------------+-------+-------+---------+---------------------+
|苹果| 1 |全| 12.1 | 20.1 | 2 | g |真|[“苹果”,“橙色”]|
|苹果| 2 |全| 7.1 | 12.0 | 1 | g |假|[“橙色”]|
|苹果| 1 |部分| 14.3 | 13.1 | 3 | g |假|[“橙色”]|
|橙色| 1 |满| 19.1 | 20.1 | 2 | g |真|[“苹果”,“橙色”]|
|橙色| 2 |满| 17.1 | 18.5 | 1 | g |真|[“橙色”]|
|橙色| 1 |部分| 23.4 | 22.7 | 3 | g |真|[“橙色”]|
|葡萄| 1 |全| 23.1 | 22.1 | 3 | g |假|[“橙色”]|
|葡萄| 2 |全| 17.2 | 17.1 | 2 | g |假|[“橙色”]|
|葡萄| 1 |部分| 19.1 | 19.4 | 1 | g |假|[“橙色”]|
+--------+------+----------+------------+-------------+-------+-------+---------+---------------------+
我是熊猫的新手,所以我肯定我遗漏了一些很简单的东西。

最佳答案

您可以返回boolean值,其中second_pass等于groupmax,因为idxmax只返回max的第一次出现:

df['highest'] = df.groupby(['test', 'analysis'])['second_pass'].transform(lambda x: x == np.amax(x)).astype(bool)

然后使用np.where捕获具有fruitgroup的所有max值,并将结果merge捕获到您的DataFrame中,如下所示:
highest_fruits = df.groupby(['test', 'analysis']).apply(lambda x: [f for f in np.where(x.second_pass == np.amax(x.second_pass), x.fruit.tolist(), '').tolist() if f!='']).reset_index()
df =df.merge(highest_fruits, on=['test', 'analysis'], how='left').rename(columns={0: 'highest_fruit'})

最后,对于您的后续行动:
first_pass = df.groupby(['test', 'analysis']).apply(lambda x: {fruit: x.loc[x.fruit==fruit, 'first_pass'] for fruit in x.highest_fruit.iloc[0]}).reset_index()
df =df.merge(first_pass, on=['test', 'analysis'], how='left').rename(columns={0: 'first_pass_highest_fruit'})

得到:
  analysis  first_pass   fruit  order  second_pass  test units highest  \
0     full        12.1   apple      2         20.1     1     g    True
1     full         7.1   apple      1         12.0     2     g   False
2  partial        14.3   apple      3         13.1     1     g   False
3     full        19.1  orange      2         20.1     1     g    True
4     full        17.1  orange      1         18.5     2     g    True
5  partial        23.4  orange      3         22.7     1     g    True
6     full        23.1   grape      3         14.1     1     g   False
7     full        17.2   grape      2         17.1     2     g   False
8  partial        19.1   grape      1         19.4     1     g   False

     highest_fruit             first_pass_highest_fruit
0  [apple, orange]  {'orange': [19.1], 'apple': [12.1]}
1         [orange]                   {'orange': [17.1]}
2         [orange]                   {'orange': [23.4]}
3  [apple, orange]  {'orange': [19.1], 'apple': [12.1]}
4         [orange]                   {'orange': [17.1]}
5         [orange]                   {'orange': [23.4]}
6  [apple, orange]  {'orange': [19.1], 'apple': [12.1]}
7         [orange]                   {'orange': [17.1]}
8         [orange]                   {'orange': [23.4]}

关于python - Pandas DataFrame窗口功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34735915/

10-12 22:19
查看更多