pandas dataframe:在固定其他列的列中提取具有特定 crtieria/conditions 最小值的数据
pandas dataframe: extract data with specific crtieria/conditions minimum in a column fixing other columns
首先非常感谢您的帮助。
我有一个 table,我用 pandas 作为 df 导入。对于每个唯一的 foo&bar,我想获得一个新的 df,其中包含最小的 zoo 和相应的 qux。我试图简化我的数据框,但实际上我有数百个 qux 和 foo 以及几十个 bar。
我的输入table:
foo
bar
zoo
qux
aaa
HB1
9.75
lab1
aaa
HB1
4.87
lab2
aaa
HB1
3.05
lab3
aaa
TS3
8.51
lab1
aaa
TS3
2.58
lab2
aaa
TS3
2.48
lab3
bbb
HB1
9.03
lab1
bbb
HB1
6.11
lab2
bbb
HB1
7.66
lab3
bbb
TS3
3.57
lab1
bbb
TS3
4.25
lab2
bbb
TS3
1.63
lab3
我的预期结果
foo
bar
zoo
qux
aaa
HB1
3.05
lab3
aaa
TS3
2.48
lab3
bbb
HB1
6.11
lab2
bbb
TS3
1.63
lab3
我尝试使用 groupby 或 pivot_table,我获得了每个 bar 和每个 foo 的 min zoo 但我没有获得相应的 qux 并且 df 完全重塑并且看起来不像我的第一种格式。我有点迷路了。
非常感谢您的帮助。
您可以按 descending
顺序对数据框中的值进行排序并使用 groupby.tail(1)
:
df.sort_values(by=['foo','bar','zoo','qux'],ascending=False).groupby(['foo','bar']).tail(1)
foo bar zoo qux
2 aaa HB1 3.05 lab3
5 aaa TS3 2.48 lab3
8 bbb HB1 7.66 lab3
11 bbb TS3 1.63 lab3
通过groupby获取最小值的索引位置,索引原始df得到行数:
df.loc[df.groupby(['foo', 'bar']).zoo.idxmin()]
foo bar zoo qux
2 aaa HB1 3.05 lab3
5 aaa TS3 2.48 lab3
7 bbb HB1 6.11 lab2
11 bbb TS3 1.63 lab3
首先非常感谢您的帮助。 我有一个 table,我用 pandas 作为 df 导入。对于每个唯一的 foo&bar,我想获得一个新的 df,其中包含最小的 zoo 和相应的 qux。我试图简化我的数据框,但实际上我有数百个 qux 和 foo 以及几十个 bar。
我的输入table:
foo | bar | zoo | qux |
---|---|---|---|
aaa | HB1 | 9.75 | lab1 |
aaa | HB1 | 4.87 | lab2 |
aaa | HB1 | 3.05 | lab3 |
aaa | TS3 | 8.51 | lab1 |
aaa | TS3 | 2.58 | lab2 |
aaa | TS3 | 2.48 | lab3 |
bbb | HB1 | 9.03 | lab1 |
bbb | HB1 | 6.11 | lab2 |
bbb | HB1 | 7.66 | lab3 |
bbb | TS3 | 3.57 | lab1 |
bbb | TS3 | 4.25 | lab2 |
bbb | TS3 | 1.63 | lab3 |
我的预期结果
foo | bar | zoo | qux |
---|---|---|---|
aaa | HB1 | 3.05 | lab3 |
aaa | TS3 | 2.48 | lab3 |
bbb | HB1 | 6.11 | lab2 |
bbb | TS3 | 1.63 | lab3 |
我尝试使用 groupby 或 pivot_table,我获得了每个 bar 和每个 foo 的 min zoo 但我没有获得相应的 qux 并且 df 完全重塑并且看起来不像我的第一种格式。我有点迷路了。
非常感谢您的帮助。
您可以按 descending
顺序对数据框中的值进行排序并使用 groupby.tail(1)
:
df.sort_values(by=['foo','bar','zoo','qux'],ascending=False).groupby(['foo','bar']).tail(1)
foo bar zoo qux
2 aaa HB1 3.05 lab3
5 aaa TS3 2.48 lab3
8 bbb HB1 7.66 lab3
11 bbb TS3 1.63 lab3
通过groupby获取最小值的索引位置,索引原始df得到行数:
df.loc[df.groupby(['foo', 'bar']).zoo.idxmin()]
foo bar zoo qux
2 aaa HB1 3.05 lab3
5 aaa TS3 2.48 lab3
7 bbb HB1 6.11 lab2
11 bbb TS3 1.63 lab3