【问题标题】:How do I conditionally select rows in a Pandas data frame by如何有条件地选择 Pandas 数据框中的行
【发布时间】:2022-01-17 05:48:55
【问题描述】:

我有以下 Pandas 数据框(显示前十行):

index_x time_x  total_def_x index_y time_y  total_def_y event_time
0   2   2005.25394  15.72761    3   2005.25667  8.66223 2005.254962
1   4   2005.25941  11.31783    5   2005.26215  2.79943 2005.260101
2   11  2005.27858  8.74810    12   2005.28131  8.50871 2005.279085
3   18  2005.29774  6.31637    19   2005.30048  10.0420 2005.297804
4   52  2005.39083  0.18209    53   2005.39357  4.42270 2005.393209
5   65  2005.42642  2.71002    66   2005.42916  2.61663 2005.428290
6   106 2005.53867 -0.86598   107   2005.54141  0.26263 2005.539240
7   173 2005.72211  7.91387   174   2005.72485 -4.00652 2005.724622
8   201 2005.79877  4.09495   202   2005.80151  8.35356 2005.800502
9   217 2005.84257  6.63870   218   2005.84531 -1.81069 2005.843362
...

我想要做的是选择时间最接近event_time的时间(time_xtime_y)和相应的变形值(total_def_xtotal_def_y)并将值放入一个数据框。到目前为止,我编写的代码如下:

nearest_df = pd.DataFrame(columns=["time", "total_def"])

for et in new_df["event_time"]:

    if abs(et - new_df["time_x"].values) < abs(et - new_df["time_y"].values):

        nearest_df.append(new_df["time_x", "total_def_x"])

    else:
        nearest_df.append(new_df["time_y", "total_def_y"])

但是,我尝试重写它的每次尝试都会返回此错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

当我像 if (abs(et - new_df['time_x'].values) &lt; abs(et - new_df['time_y'].values)).all(): 这样修改代码时,我得到了这个错误:

KeyError: ('time_x', 'total_def_x')

预期输出的一个示例是这样的数据帧(nearest_df),因为将选择 time_x 和 time_y 与 event_time 的差异中较小的一个,以及它们各自的变形(total_def_x 或 y):

time        total_def
2005.25667  8.66223
2005.25941  11.31783
2005.27858  8.74810

对此的任何帮助将不胜感激。

【问题讨论】:

  • 你能提供预期的输出吗?您想要每行最接近的 x 或 y?
  • 我编辑了帖子以显示预期结果。最接近 event_time 的一个,无论是 x 还是 y。

标签: python pandas dataframe numpy filter


【解决方案1】:

你可以试试这个:

# Create temporary columns
df["dist_x"] = (df["event_time"] - df["time_x"]).abs()
df["dist_y"] = (df["event_time"] - df["time_y"]).abs()

# Select proper rows
df_x = df.loc[df["dist_x"] < df["dist_y"], ["time_x", "total_def_x"]]
df_y = df.loc[df["dist_x"] >= df["dist_y"], ["time_y", "total_def_y"]]

# Rename and append results
df_x.columns = df_y.columns = ["time", "total_def"]
new_df = pd.concat(objs=[df_x, df_y]).sort_index()

print(new_df)
# Outputs
         time  total_def
0  2005.25394   15.72761
1  2005.25941   11.31783
2  2005.27858    8.74810
3  2005.29774    6.31637
4  2005.39357    4.42270
5  2005.42916    2.61663
6  2005.53867   -0.86598
7  2005.72485   -4.00652
8  2005.80151    8.35356
9  2005.84257    6.63870

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多