我有一个Pandas Dataframe ,看起来像这样
| | 识别号|时间|价值|
| - ------|- ------|- ------|- ------|
| 无|1个|十个|1.0分|
| 1个|第二章|十个|2.0版|
| 第二章|1个|二十个|钠氮|
| 三个|三个|二十个|4.0版|
| 四个|1个|三十|钠氮|
| 五个|第二章|三十|钠氮|
| 六个|四个|三十|钠氮|
我想对每个ID进行采样和保持,使用最后一个已知的非空值来基于参数max_time
估算一些空值。对于Value
为空且时间为t
的每一行,如果有一行具有相同的ID
和时间t_other
,例如t-max_time <= t_other <= t
,然后我想用满足这个约束的最大值t_other
的行的Value
替换我的行的Value
。
例如,在上面的表格中,如果max_time=10
,那么对于Time = 20
处的ID = 1
,我们有一个空值Value
,可以用Time = 10
处的值来填充。
| | 识别号|时间|价值|
| - ------|- ------|- ------|- ------|
| 无|1个|十个|1.0分|
| 1个|第二章|十个|2.0版|
| 第二章|1个|二十个|1.0分|
| 三个|三个|二十个|4.0版|
| 四个|1个|三十|钠氮|
| 五个|第二章|三十|钠氮|
| 六个|四个|三十|钠氮|
其他空值在最后10个时间单位中没有值,无法填充它们,因此它们保持为空值。
我问了ChatGPT,它给出了解决方案
def fill_nulls(group):
# Fill nulls with the last non-null value
group['Value'] = group['Value'].ffill()
# Calculate the time difference between consecutive rows
time_diff = group['Time'].diff()
# Set nulls to NaN if the time difference is greater than 10
group['Value'][time_diff > 10] = np.nan
return group
filled_df = df.groupby('ID').apply(fill_nulls)
但这是使用行索引2被填充的事实来表示行索引4不应该被替换为null,并且在那里也填充1.0
,这不是我想要的。
我认为最好的方法是填充所有行,并将不应该填充的行替换为null,就像ChatGPT尝试的那样,但我不知道如何编写哪些行应该替换为null的逻辑。
1条答案
按热度按时间z0qdvdin1#
您可以使用布尔掩码和
merge
:输出: