我有一个数据框看起来是由生成的:

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


python - Python填充字符串列“forward”并将groupby结果附加到数据框-LMLPHP

注意:如果必须使用该组的第一个元素转发填充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/

10-13 08:19
查看更多