我有一个数据框看起来是由生成的:
df = pd.DataFrame([[100, ' tes t ', 3], [100, np.nan, 2], [101, ' test1', 3 ], [101,' ', 4]])
看起来像
0 1 2
0 100 tes t 3
1 100 NaN 2
2 101 test1 3
3 101 4
我想用test和test1填充列1“ forward”。我相信一种方法是使用np.nan替换空白,但是这很难,因为单词也包含空白。我也可以按列0分组,然后使用每个组的第一个元素向前填充。您能为我提供的两种替代方法的一些代码吗?
另外,我想添加一列,其中包含
最终数据框应如下所示
0 1 2 3
0 100 tes t 3 2.5
1 100 tes t 2 2.5
2 101 test1 3 3.5
3 101 test1 4 3.5
您还可以建议如何完成这样的事情吗?
非常感谢,如果您需要更多信息,请告诉我。
最佳答案
IIUC,您可以使用str.strip
,然后检查剥离的字符串是否为空。
然后,执行groupby
操作,并通过方法Nans
填充ffill
,并使用groupby.transform
函数计算平均值,如下所示:
df[1] = df[1].str.strip().dropna().apply(lambda x: np.NaN if len(x) == 0 else x)
df[1] = df.groupby(0)[1].fillna(method='ffill')
df[3] = df.groupby(0)[2].transform(lambda x: x.mean())
df
注意:如果必须使用该组的第一个元素转发填充
NaN
值,则必须执行以下操作:df.groupby(0)[1].apply(lambda x: x.fillna(x.iloc[0]))
分步步骤:
由于我们只想在字符串上应用该函数,因此我们删除之前存在的所有
NaN
值,否则由于列中存在浮点数和字符串元素,并且由于没有方法而抱怨float,因此我们将得到TypeError
len
。df[1].str.strip().dropna()
0 tes t # operates only on indices where strings are present(empty strings included)
2 test1
3
Name: 1, dtype: object
重新索引部分不是必需的步骤,因为它仅对存在字符串的索引进行计算。
同样,
reset_index(drop=True)
部分的确是不需要的,因为groupby对象在fillna
之后返回了一个序列,该序列可以分配回第1列。关于python - Python填充字符串列“forward”并将groupby结果附加到数据框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39794206/