通过将一列与其他列的列表进行比较来过滤 Dataframe
Filter Dataframe by comparing one column to list of other columns
我有一个包含大量浮点列的数据框。我想过滤数据框,只留下同一数据框的高和低列之间的值。
当条件是一列与另一列相比时,我知道如何做到这一点。但是有 102 列,所以我不能为每一列写一个条件。我所有的研究只是说明如何将两列而不是一列与所有其他列进行比较(或者我没有输入正确的搜索词)。
我试过了df= df[ (df['High'] <= df[DFColRBs]) & (df['Low'] >= df[DFColRBs])].copy()
但是它会删除所有内容。
我试过了booleanselction = df[ (df[DFColRBs].between(df['High'],df['Low'])]
我试过了:df= df[(df[DFColRBs].ge(df['Low'])) & (df[DFColRBs].le(df['Low']))].copy()
我试过了:
BoolMatrix = (df[DFColRBs].ge(DF_copy['Low'], axis=0)) & (df[DFColRBs].le(DF_copy['Low'], axis=0))
df= df[BoolMatrix].copy()
但它会删除数据框中的所有内容,甚至是列表中未包含的 3 列。
感谢指导。
示例数据框:
High Low Close _1m_21 _1m_34 _1m_55 _1m_89 _1m_144 _1m_233 _5m_21 _5m_34 _5m_55
0 1.23491 1.23456 1.23456 1.23401 1.23397 1.23391 1.2339 1.2337 1.2335 1.23392 1.23363 1.23343
1 1.23492 1.23472 1.23472 1.23422 1.23409 1.234 1.23392 1.23375 1.23353 1.23396 1.23366 1.23347
2 1.23495 1.23479 1.23488 1.23454 1.23422 1.23428 1.23416 1.23404 1.23372 1.23415 1.234 1.23367
3 1.23494 1.23472 1.23473 1.23457 1.23425 1.23428 1.23417 1.23405 1.23373 1.23415 1.234 1.23367
根据你在评论中所说的,最好将 df 分成你想要操作的部分和你不需要的部分,然后使用矩阵运算。
tmp_df = DF_copy.iloc[:, 3:].copy()
# or tmp_df = DF_copy[DFColRBs].copy()
# mask by comparing test columns with the high and low columns
m = tmp_df.le(DF_copy['High'], axis=0) & tmp_df.ge(DF_copy['Low'], axis=0)
# combine the masked df with the original cols
DF_copy2 = pd.concat([DF_copy.iloc[:, :3], tmp_df.where(m)], axis=1)
# or replace with DF_copy.iloc[:, :3] with DF_copy.drop(columns=DFColRBs)
我有一个包含大量浮点列的数据框。我想过滤数据框,只留下同一数据框的高和低列之间的值。
当条件是一列与另一列相比时,我知道如何做到这一点。但是有 102 列,所以我不能为每一列写一个条件。我所有的研究只是说明如何将两列而不是一列与所有其他列进行比较(或者我没有输入正确的搜索词)。
我试过了df= df[ (df['High'] <= df[DFColRBs]) & (df['Low'] >= df[DFColRBs])].copy()
但是它会删除所有内容。
我试过了booleanselction = df[ (df[DFColRBs].between(df['High'],df['Low'])]
我试过了:df= df[(df[DFColRBs].ge(df['Low'])) & (df[DFColRBs].le(df['Low']))].copy()
我试过了:
BoolMatrix = (df[DFColRBs].ge(DF_copy['Low'], axis=0)) & (df[DFColRBs].le(DF_copy['Low'], axis=0))
df= df[BoolMatrix].copy()
但它会删除数据框中的所有内容,甚至是列表中未包含的 3 列。
感谢指导。
示例数据框:
High Low Close _1m_21 _1m_34 _1m_55 _1m_89 _1m_144 _1m_233 _5m_21 _5m_34 _5m_55
0 1.23491 1.23456 1.23456 1.23401 1.23397 1.23391 1.2339 1.2337 1.2335 1.23392 1.23363 1.23343
1 1.23492 1.23472 1.23472 1.23422 1.23409 1.234 1.23392 1.23375 1.23353 1.23396 1.23366 1.23347
2 1.23495 1.23479 1.23488 1.23454 1.23422 1.23428 1.23416 1.23404 1.23372 1.23415 1.234 1.23367
3 1.23494 1.23472 1.23473 1.23457 1.23425 1.23428 1.23417 1.23405 1.23373 1.23415 1.234 1.23367
根据你在评论中所说的,最好将 df 分成你想要操作的部分和你不需要的部分,然后使用矩阵运算。
tmp_df = DF_copy.iloc[:, 3:].copy()
# or tmp_df = DF_copy[DFColRBs].copy()
# mask by comparing test columns with the high and low columns
m = tmp_df.le(DF_copy['High'], axis=0) & tmp_df.ge(DF_copy['Low'], axis=0)
# combine the masked df with the original cols
DF_copy2 = pd.concat([DF_copy.iloc[:, :3], tmp_df.where(m)], axis=1)
# or replace with DF_copy.iloc[:, :3] with DF_copy.drop(columns=DFColRBs)