如何对熊猫进行分组和更新值?

时间:2019-08-13 13:08:08

标签: python python-3.x pandas dataframe

我有一个pandas DataFrame,看起来类似于以下内容...

>>> df = pd.DataFrame({
...     'col1':['A','C','B','A','B','C','A'],
...     'col2':[np.nan,1.,np.nan,1.,1.,np.nan,np.nan],
...     'col3':[0,1,9,4,2,3,5],
...     })
>>> df
  col1  col2  col3
0    A   NaN     0
1    C   1.0     1
2    B   NaN     9
3    A   1.0     4
4    B   1.0     2
5    C   NaN     3
6    A   NaN     5

我想做的是按值对col1的行进行分组,然后更新NaN中的所有col2值,以根据的最后一个最高值将值递增1。该组在col1中。

这样我的预期结果将如下所示...

>>> df
  col1  col2  col3
0    A   1.0     4
1    A   2.0     0
2    A   3.0     5
3    B   1.0     2
4    B   2.0     9
5    C   1.0     1
6    C   2.0     3

我相信我可以在groupby上使用类似col1的方法,尽管我不确定如何根据{{1 }}。我已经尝试了以下方法,但是没有增加col2的值,而是将值更新为所有col1并添加了另一列...

col1

2 个答案:

答案 0 :(得分:2)

仅将GroupBy.cumcount用于缺少值的行,使用GroupBy.transformmax为每个组添加最大值,最后用fillna替换为原始值:

df = pd.DataFrame({
    'col1':['A','C','B','A','B','B','B'],
     'col2':[np.nan,1.,np.nan,1.,3.,np.nan, 0],
     'col3':[0,1,9,4,2,3,4],
     })
print (df)
  col1  col2  col3
0    A   NaN     0
1    C   1.0     1
2    B   NaN     9
3    A   1.0     4
4    B   3.0     2
5    B   NaN     3
6    B   0.0     4

df = df.sort_values(['col1','col2'], na_position='last')
s = df.groupby('col1')['col2'].transform('max')
df['new'] = (df[df['col2'].isna()]
                   .groupby('col1')
                   .cumcount()
                   .add(1)
                   .add(s)
                   .fillna(df['col2']).astype(int))


print (df)
  col1  col2  col3  new
3    A   1.0     4    1
0    A   NaN     0    2
6    B   0.0     4    0
4    B   3.0     2    3
2    B   NaN     9    4
5    B   NaN     3    5
1    C   1.0     1    1

答案 1 :(得分:2)

另一种方式:

df['col2_new'] = df.groupby('col1')['col2'].apply(lambda x: x.replace(np.nan, x.value_counts().index[0]+1))
df = df.sort_values('col1')