在 pandas 2 乘 2 的 DataFrame 的行之间迭代

Iterate between the rows of a DataFrame of pandas 2 by 2

假设为以下 DataFrame,其中时间列由 Python TimeDelta 对象定义:

ID date direction time
0 2022-01-02 IN NaT
0 2022-01-03 OUT 1 days
0 2022-01-04 IN NaT
0 2022-01-08 OUT 4 days
1 2022-03-02 IN NaT
1 2022-03-05 OUT 3 days
2 2022-04-06 IN NaT
2 2022-04-10 OUT 4 days

我需要迭代现有的 DataFrame 以最有效的方式创建另一个 DataFrame,其中包含来自两两行的信息,即:

ID start_date end_date time
0 2022-01-02 2022-01-03 1 days
0 2022-01-04 2022-01-08 4 days
1 2022-03-02 2022-03-05 3 days
2 2022-04-06 2022-04-10 4 days

假设原始DataFrame包含在df中。我需要一种两两遍历行的方法,能够在每次迭代中查询第一行及其下一行的信息。希望您能帮帮我,先谢谢了。

您可以使用 df.loc + df.shift 创建最终数据框:

df_out = pd.DataFrame(
    {
        "ID": df.loc[::2, "ID"],
        "start_date": df.loc[::2, "date"],
        "end_date": df.shift(-1).loc[::2, "date"],
        "time": df.shift(-1).loc[::2, "time"],
    }
)
print(df_out)

打印:

   ID  start_date    end_date    time
0   0  2022-01-02  2022-01-03  1 days
2   0  2022-01-04  2022-01-08  4 days
4   1  2022-03-02  2022-03-05  3 days
6   2  2022-04-06  2022-04-10  4 days

或者:

df_out = pd.DataFrame(
    {
        "ID": df.loc[::2, "ID"].values,
        "start_date": df.loc[::2, "date"].values,
        "end_date": df.loc[1::2, "date"].values,
        "time": df.loc[1::2, "time"].values,
    }
)