Я хочу выбрать записи одного фрейма данных, скажем, df2, на основе статистики поперечного сечения другого фрейма данных, скажем, df1:

df1 = pd.DataFrame([[4, 5, 9, 11],
               [3, 1, 45, 1],
               [88, 314, 2, 313]], columns = ['A', 'B', 'C', 'D'])
df2 = pd.DataFrame([['h','e','l','p'],
               ['m','y','q','u'],
               ['e','r','y','.']], columns = ['A', 'B', 'C', 'D'])

Например, если статистика поперечного сечения для df1 является максимальной операцией, то для трех строк в df1 соответствующими столбцами с максимальными записями будут 'D', 'C', 'B' (соответствующие записям 11, 45, 314).

Выбор только этих записей в df2 должен дать мне:

enter image description here

Чего я могу достичь:

mask_ = pd.DataFrame(False, index=df1.idxmax(1).index, columns=df1.idxmax(1))
for k,i in enumerate(df1.idxmax(1)):
    mask_.loc[k, i] = True
df2[mask_]

Однако это кажется громоздким; есть ли более простой способ сделать это?

1
MaviPranav 2 Мар 2021 в 15:36

1 ответ

Лучший ответ

Решение работает, если имена индексов и столбцов совпадают в обоих DataFrames.

Используйте DataFrame.where с маской сравнения максимальных значений по всем значениям строк:

df = df2.where(df1.eq(df1.max(axis=1), axis=0))
print (df)
     A    B    C    D
0  NaN  NaN  NaN    p
1  NaN  NaN    q  NaN
2  NaN    r  NaN  NaN
1
jezrael 2 Мар 2021 в 12:38