Python 3.x 将字符串列的最后一个值展开为groupby Dataframe

Python 3.x 将字符串列的最后一个值展开为groupby Dataframe,python-3.x,string,pandas,dataframe,group-by,Python 3.x,String,Pandas,Dataframe,Group By,我有以下数据帧: +--------+----+ |id |name| +--------+----+ | 1| | | 1| | | 1| | | 1|Carl| | 2| | | 2| | | 2|John| +--------+----+ 我想要实现的是将每个组的最后一个值扩展到组的其余部分: +--------+----+ |id |name| +---

我有以下数据帧:

+--------+----+
|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列,但不适用于字符串列

我得到以下错误:

没有要聚合的数字类型

提前谢谢

编辑 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|
+--------+----+

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

df['name'] = df['name'].bfill()
如果没有,请用NaN替换空字符串。

尝试此操作

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

这在我的情况下是无效的,但符合我的问题。我会编辑它!给出的答案是正确的。你只需要分组ie
df.groupby('id').bfill()
你完全正确,非常感谢!!!实际上,要让它工作起来,您应该这样做:
df.groupby('id')['name'].bfill()