查找groupby / transform的唯一值,不设置None

时间:2019-06-16 12:36:54

标签: pandas pandas-groupby

起点就是这种数据框。

df = pd.DataFrame({'author': ['Jack', 'Steve', 'Greg', 'Jack', 'Steve', 'Greg', 'Greg'], 'country':['USA', None, None, 'USA', 'Germany', 'France', 'France'], 'c':np.random.randn(7), 'd':np.random.randn(7)})

  author  country         c         d
0  Jack   USA     -2.594532  2.027425
1  Steve  None    -1.104079 -0.852182
2  Greg   None    -2.356956 -0.450821
3  Jack   USA     -0.910153 -0.734682
4  Steve  Germany  1.025113  0.441512
5  Greg   France   0.218085  1.369443
6  Greg   France   0.254485  0.322768

期望的输出是一列或多列,其中包含作者所在的国家/地区。

0    [USA]          
1    [Germany]
2    [France] 
3    [USA]          
4    [Germany]
5    [France] 
6    [France] 

它不一定是列表,但是我最近的解决方案给出了一个列表作为输出。 它可以是单独的列。

df.groupby('author')['country'].transform('unique')

0    [USA]          
1    [None, Germany]
2    [None, France] 
3    [USA]          
4    [None, Germany]
5    [None, France] 
6    [None, France]

是否有一种简便的方法可以从其中删除“无”?

1 个答案:

答案 0 :(得分:1)

您可以使用Series.dropna删除缺失值,调用SeriesGroupBy.unique并通过Series.map创建新列:

df['new'] = df['author'].map(df['country'].dropna().groupby(df['author']).unique())
print (df)
  author  country         c         d        new
0   Jack      USA  0.453358 -1.983282      [USA]
1  Steve     None  0.011792  0.383322  [Germany]
2   Greg     None -1.551810  0.308982   [France]
3   Jack      USA  1.646301  0.040245      [USA]
4  Steve  Germany -0.211451  0.841131  [Germany]
5   Greg   France  1.049269 -0.813806   [France]
6   Greg   France -1.244549  1.009006   [France]