我有以下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|
+--------+----+
发布于 2019-11-24 23:12:56
如果空值为NaN,您是否可以尝试填充NaN
df['name'] = df['name'].bfill()
如果不是,将空字符串替换为NaN。
发布于 2019-11-25 05:54:22
尝尝这个。
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
https://stackoverflow.com/questions/59023312
复制相似问题