将字符串列的最后一个值扩展到groupby Pandas Dataframe

问题描述 投票:0回答:2

我有以下Pandas数据框:

+--------+----+
|id      |name|
+--------+----+
|       1|    |
|       1|    |
|       1|    |
|       1|Carl|
|       2|    |
|       2|    |
|       2|John|
+--------+----+

我想实现的是将每个组的最后一个值扩展到该组的其余部分:

+--------+----+
|id      |name|
+--------+----+
|       1|Carl|
|       1|Carl|
|       1|Carl|
|       1|Carl|
|       2|John|
|       2|John|
|       2|John|
+--------+----+

这看起来很简单,但是由于列的类型,我正在努力实现它。

到目前为止,我尝试过的是:

df['name'] = df.groupby('id')['name'].transform('last')

这适用于int或float列,但不适用于字符串列。

我收到以下错误:

No numeric types to aggregate

提前感谢。

编辑

bfill()无效,因为我可以拥有以下内容:

+--------+----+
|id      |name|
+--------+----+
|       1|    |
|       1|    |
|       1|    |
|       1|Carl|
|       2|    |
|       2|    |
|       2|    |
|       3|    |
|       3|    |
|       3|John|
+--------+----+

在这种情况下,我希望id = 2保留为NaN,并且最终将其保留为John,这是不正确的。所需的输出将是:

+--------+----+
|id      |name|
+--------+----+
|       1|Carl|
|       1|Carl|
|       1|Carl|
|       1|Carl|
|       2|    |
|       2|    |
|       2|    |
|       3|John|
|       3|John|
|       3|John|
+--------+----+
python-3.x string pandas dataframe group-by
2个回答
2
投票

如果空值为NaN,可以尝试fillna

df['name'] = df['name'].bfill()

如果不是,请用NaN替换空字符串。


0
投票

尝试一下。

import pandas as pd
import numpy as np

dff = pd.DataFrame({"id":[1,1,1,1,2,2,2,3,3,3],
                   "name":["","","","car1","","","","","","john"]})
dff = dff.replace(r'', np.NaN)
def c(x):
   if sum(pd.isnull(x)) != np.size(x):
       l = [v for v in x if type(v) == str]
       return [l[0]]*np.size(x)
   else:
       return [""]*np.size(x)


df=dff.groupby('id')["name"].apply(lambda x:c(list(x)))
df = df.to_frame().reset_index()
df = df.set_index('id').name.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'name'})

输出

   id  name
0   1  car1
1   1  car1
2   1  car1
3   1  car1
0   2      
1   2      
2   2      
0   3  john
1   3  john
2   3  john
© www.soinside.com 2019 - 2024. All rights reserved.