如何在熊猫中使用groupby保持具有最高值的另一列的值

时间:2019-07-05 09:43:59

标签: python python-3.x pandas

我有以下数据框:

import pandas as pd

df = pd.DataFrame({'var': ['A', 'A', 'B', 'B', 'C', 'C', 'C'],
                       'value': [1, 2, 1, 2, 3, 4, 5],
                       'input': [0.1, 0.1, 0.2, 0.2, 0.3, 0.3, 0.3]})

我想将var最高的value保留input,并将其余的var设置为NA。 / p>

所以我想结束:

   df = pd.DataFrame({'var': [np.nan, 'A', np.nan, 'B', np.nan, np.nan, 'C'],
                       'value': [1, 2, 1, 2, 3, 4, 5],
                       'input': [0.1, 0.1, 0.2, 0.2, 0.3, 0.3, 0.3]})

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

GroupBy.transformmax一起用于Series,其大小与原始DataFrame相同,比较不等于Series.ne并使用loc设置新值:< / p>

mask = df.groupby('var')['value'].transform('max').ne(df['value'])

df.loc[mask, 'var'] = np.nan
print (df)
   var  value  input
0  NaN      1    0.1
1    A      2    0.2
2  NaN      1    0.3
3    B      2    0.4
4  NaN      3    0.5
5  NaN      4    0.6
6    C      5    0.7

答案 1 :(得分:1)

where是根据某些条件在列中设置NaN的有用技巧。

df['var'].where(df.groupby('var').value.transform('max').eq(df['value']))

输出

0   NaN
1   A
2   NaN
3   B
4   NaN
5   NaN
6   C