首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将字符串列的最后一个值展开为groupby Pandas Dataframe

将字符串列的最后一个值展开为groupby Pandas Dataframe
EN

Stack Overflow用户
提问于 2019-11-24 23:05:48
回答 2查看 85关注 0票数 0

我有以下Pandas数据帧:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------+----+
|id      |name|
+--------+----+
|       1|    |
|       1|    |
|       1|    |
|       1|Carl|
|       2|    |
|       2|    |
|       2|John|
+--------+----+

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------+----+
|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()无效,因为我可以包含以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------+----+
|id      |name|
+--------+----+
|       1|    |
|       1|    |
|       1|    |
|       1|Carl|
|       2|    |
|       2|    |
|       2|    |
|       3|    |
|       3|    |
|       3|John|
+--------+----+

在本例中,我希望id =2保持为NaN,结果将是John,这是不正确的。期望的输出将是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------+----+
|id      |name|
+--------+----+
|       1|Carl|
|       1|Carl|
|       1|Carl|
|       1|Carl|
|       2|    |
|       2|    |
|       2|    |
|       3|John|
|       3|John|
|       3|John|
+--------+----+
EN

回答 2

Stack Overflow用户

发布于 2019-11-24 23:12:56

如果空值为NaN,您是否可以尝试填充NaN

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df['name'] = df['name'].bfill()

如果不是,将空字符串替换为NaN。

票数 2
EN

Stack Overflow用户

发布于 2019-11-25 05:54:22

尝尝这个。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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'})

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   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
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59023312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文