我有以下数据框:
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]})
有什么想法吗?
答案 0 :(得分:3)
将GroupBy.transform
与max
一起用于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