正向填充pandas数据帧,而不复制行中的值

2024-07-01 07:21:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的数据文件,所有空白区域都是np.nan公司. 在

         coupler_id   25       26         28        29
timestamp               
2015-12-05 03:02:29                     12017.0     12008.0
2015-12-05 03:04:47                     12017.0     12008.0
2015-12-05 03:09:14                     12017.0     12008.0
2015-12-05 03:12:12                     12017.0     12008.0
2015-12-05 03:23:06                                 12008.0
2015-12-05 03:24:45                                 12017.0
2015-12-05 06:31:20                     12017.0 
2015-12-05 09:36:29                     12011.0 
2015-12-05 23:59:35                                 12017.0
2015-12-06 23:59:38                                 12017.0

我想向前填充缺少的值(限制1),而不复制行中的值。所以上面的数据帧应该是这样的:

^{pr2}$

编辑:

如果第25列和第26列中有数据,而第28列索引2015-12-05 03:24:45中没有前面的nan怎么办。在

^{3}$

Tags: 数据id区域编辑数据文件np公司nan
1条回答
网友
1楼 · 发布于 2024-07-01 07:21:45

更新答案

下面是一个更一般的情况,它检查所有列:

def remove_duplicates(data, ix, names):
    # if only 1 entry, no comparison needed
    if data.notnull().sum() == 1: 
        return data
    # mark all duplicates
    dupes = data.dropna().duplicated(keep=False) 
    if dupes.any():
        for name in names:
            # if previous value was NaN AND current is duplicate, replace with NaN
            if np.isnan(df.loc[ix, name]) & dupes[name]:
                data[name] = np.nan
    return data

filled = df.ffill(limit=1)
filled.apply(lambda row: remove_duplicates(row, row.name, row.index), axis=1)

                          25       26       28       29
2015-12-05 03:02:29      NaN      NaN  12017.0  12008.0
2015-12-05 03:04:47      NaN      NaN  12017.0  12008.0
2015-12-05 03:09:14      NaN      NaN  12017.0  12008.0
2015-12-05 03:12:12      NaN      NaN  12017.0  12008.0
2015-12-05 03:23:06  12007.0  12018.0  12017.0  12008.0
2015-12-05 03:24:45  12033.0  12050.0  12025.0  12017.0
2015-12-05 06:31:20      NaN  12033.0  12017.0      NaN
2015-12-05 09:36:29  12008.0  12033.0  12011.0      NaN
2015-12-05 23:59:35  12008.0      NaN  12011.0  12017.0
2015-12-06 23:59:38      NaN      NaN      NaN  12017.0

上一个答案
您可以使用ffill(limit=1),然后检查是否存在重复的,如果前面的一列是NaN。在

^{pr2}$

相关问题 更多 >

    热门问题