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()