Python 具有第一个有效值(窗口函数)的groupby fillna

Python 具有第一个有效值(窗口函数)的groupby fillna,python,pandas,Python,Pandas,我有一个数据集,我需要有条件地用适当的groupby中的第一个值填充NAS,但我无法找到它 import numpy as np import pandas as pd df_dict = { 'id':[1, 1, 1, 1, 2, 2, 2, 2], 'data':['A', np.nan, np.nan, np.nan, 'B', np.nan, np.nan, np.nan, 'C', np.nan, np.nan] } df = pd.DataFrame(df_dict

我有一个数据集,我需要有条件地用适当的groupby中的第一个值填充NAS,但我无法找到它

import numpy as np
import pandas as pd
df_dict = {
    'id':[1, 1, 1, 1, 2, 2, 2, 2],
    'data':['A', np.nan, np.nan, np.nan, 'B', np.nan, np.nan, np.nan, 'C', np.nan, np.nan]
}
df = pd.DataFrame(df_dict)
我需要创建一个如下所示的数据帧:

final_dict = {
    'id':[1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2],
    'data':['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C']
}
final = pd.DataFrame(final_dict)
我的建议是按id分组,然后做一个.filln操作,但我不知道该做什么

我试过了

df.groupby('id')['data'].fillna(df['data'].first_valid_index())
但那是0,而不是复制我想要的

我还有另一个部分解决方案:

for col_name, data in df.items():
    df[col_name] = df.groupby('id').apply(
        lambda x: x[col_name].fillna(x.loc[x[col_name].last_valid_index(), col_name])
    ).reset_index(drop=True)
菲尔娜,变换,第一 转换为每个组获取内容,然后跨组广播 “first”获取每个组的第一个有效值 fillna提供了一个字典,您可以在其中指定用什么填充哪个列 菲尔娜,变换,第一 转换为每个组获取内容,然后跨组广播 “first”获取每个组的第一个有效值 fillna提供了一个字典,您可以在其中指定用什么填充哪个列 熊猫的fillna为我们提供了一种方法:

df.groupby('id')['data'].fillna(method='ffill')
这正是我想要的。

pandas'fillna有一种方法可以为我们做到这一点:

df.groupby('id')['data'].fillna(method='ffill')

这正是我想要的。

谢谢!对于id=2中最后3个数据为'C'的位置,这是否有效?它将保留'C',但用'B'填充缺失。谢谢!这是否适用于id=2的最后3个,其中data='C'?它将保留'C',但用'B'填充缺失。这假设在该组中的第一个非空值之前没有要填充的空值。如果有,它将使它们为空。这可能是你想要的,但你应该清楚区别。此外,如果存在多个间隙,则将使用组中最新的非空值(而不是第一个非空值)进行填充。同样,这可能是你想要的,但你应该知道区别。第一个假设是真实的,我的数据设计,第二个也是我想要的。那太好了。还有,你的问题需要澄清一下。您的输入数据帧没有“C”的提示。您可能希望提供有效的输入以实现所需的输出。另外,你想向前填充不是很明显,因此我感到困惑。您还可以通过使其更清晰来提高质量。然而,在这样做时,你可能会使这成为一个重复的问题。。。但那也没关系。如果你想让我删除我的帖子,我会让你决定。它根本不能回答您的问题。这假设在该组中的第一个非空值之前没有空值可填充。如果有,它将使它们为空。这可能是你想要的,但你应该清楚区别。此外,如果存在多个间隙,则将使用组中最新的非空值(而不是第一个非空值)进行填充。同样,这可能是你想要的,但你应该知道区别。第一个假设是真实的,我的数据设计,第二个也是我想要的。那太好了。还有,你的问题需要澄清一下。您的输入数据帧没有“C”的提示。您可能希望提供有效的输入以实现所需的输出。另外,你想向前填充不是很明显,因此我感到困惑。您还可以通过使其更清晰来提高质量。然而,在这样做时,你可能会使这成为一个重复的问题。。。但那也没关系。如果你想让我删除我的帖子,我会让你决定。这根本不能回答你的问题。