我的数据框:
import pandas as pd
df = pd.DataFrame(
{
'a': ['a', 'a', 'a', 'b', 'c', 'x', 'j', 'w'],
'b': [1, 1, 1, 2, 2, 3, 3, 3],
}
)
预期输出正在更改列
a
:
a b
0 a 1
1 a 1
2 a 1
3 NaN 2
4 NaN 2
5 NaN 3
6 NaN 3
7 NaN 3
逻辑:
这些组基于
b
。如果是团体 df.a.nunique() > 1
那么 df.a == np.nan
。
这是我的尝试。它有效,但我想知道是否有一个单行代码可以做到这一点:
df['x'] = df.groupby('b')['a'].transform('nunique')
df.loc[df.x > 1, 'a'] = np.nan
一个可能的解决方案:
g = df.groupby('b')
pd.concat(
[y if all(y['a'].iloc[0] == y['a'])
else y.assign(a = np.nan)
for x, y in g])
输出:
a b
0 a 1
1 a 1
2 a 1
3 NaN 2
4 NaN 2
5 NaN 3
6 NaN 3
7 NaN 3