python - 在具有多个具有不同值的日期时间列的 DataFrame 中设置日期时间索引

标签 python pandas dataframe merge

我有一个包含不同数据时间列的数据框,每个列旁边都有一个“值”列,其中包含在每个日期时间测量的值。正如您所看到的,某些值并不是每秒都测量的:

<表类=“s-表”> <标题> 日期时间 1 值 1 日期时间 2 值 2 <正文> 2023年1月1日10:00:00 2 2023年1月1日10:00:00 5 2023年1月1日10:00:01 10 2023年1月1日10:00:03 1 2023年1月1日10:00:02 15 2023年1月1日10:00:06 10 2023年1月1日10:00:03 6 2023年1月1日10:00:07 8 2023年1月1日10:00:04 2 NaN NaN 2023年1月1日10:00:05 10 NaN NaN 2023年1月1日10:00:06 15 NaN NaN 2023年1月1日10:00:07 6 NaN NaN

我的目标是获取一个只有一个日期时间列作为索引(例如 Datetime1)的 DataFrame,并使所有“值”列与其匹配。对于不存在的值,我想输入最后注册的值。

例如,我想获取它作为我的结果数据帧:

<表类=“s-表”> <标题> 日期时间 1 值 1 值 2 <正文> 2023年1月1日10:00:00 2 5 2023年1月1日10:00:01 10 5 2023年1月1日10:00:02 15 5 2023年1月1日10:00:03 6 1 2023年1月1日10:00:04 2 1 2023年1月1日10:00:05 10 1 2023年1月1日10:00:06 15 10 2023年1月1日10:00:07 6 8

我感兴趣的另一个选项是做相反的事情:将我的 Datetime 2 列设置为索引并删除多余的行。

请记住,这是一个简化的示例。我的数据框中至少有 10 个日期时间值列对。 我想将最长的或最短的设置为索引。

有什么想法吗?

非常感谢!

Python 3.11.2

最佳答案

让我们在这里尝试左合并:

(df.iloc[:,:2]
   .rename({'Datetime 1': 'Datetime'}, axis=1)
   .merge(df.iloc[:,2:].rename({'Datetime 2': 'Datetime'}, axis=1), how='left')
   .ffill())

             Datetime  Value 1  Value 2
0 2023-01-01 10:00:00        2        5
1 2023-01-01 10:00:01       10        5
2 2023-01-01 10:00:02       15        5
3 2023-01-01 10:00:03        6        1
4 2023-01-01 10:00:04        2        1
5 2023-01-01 10:00:05       10        1
6 2023-01-01 10:00:06       15       10
7 2023-01-01 10:00:07        6        8

这个想法是获取前两列并与最后两列执行左合并。然后最后向前填充缺失值。

我已重命名日期时间列,因此输出中只有一个日期时间列。如果您想要明确,还可以在合并时指定 on='Datetime'


当事先未知列数时,您仍然可以按两对进行切片并执行基于索引的连接:

df_list = [
    (df.iloc[:,i:i+2]
       .set_index(df.columns[i])
       .rename_axis('Datetime')) 
    for i in range(0, df.shape[1], 2)
]
(df_list[0].join(df_list[1:])
           .dropna(axis=0, how='all')
           .ffill()
           .reset_index())

             Datetime  Value 1  Value 2
0 2023-01-01 10:00:00        2        5
1 2023-01-01 10:00:01       10        5
2 2023-01-01 10:00:02       15        5
3 2023-01-01 10:00:03        6        1
4 2023-01-01 10:00:04        2        1
5 2023-01-01 10:00:05       10        1
6 2023-01-01 10:00:06       15       10
7 2023-01-01 10:00:07        6        8

df.join 支持一次合并多个 DataFrame,因此是此类操作的首选。

关于python - 在具有多个具有不同值的日期时间列的 DataFrame 中设置日期时间索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76110683/

相关文章:

python - 为决策树中的每个数据点找到对应的叶节点 (scikit-learn)

python - 使用另一个数据帧中的系数将方程应用于数据帧

python - 多个 pandas 用户连接到 SQL DB

pandas - HoloViews:为 pandas 数据框中的每一列创建箱线图

python - pandas:与不同列中的键合并(使用 col1 或 col2 合并)

python - 一个非常简单的轻量级视频编辑器

python - 斐波那契调用图中的值分区(调用图是二叉树)

python - 在Python中合并两个字典,以便添加/减去它们的键

python - 如何有条件地将 pandas 系列 append 到另一个数据框

按位置重命名 R 中的一组列