отсортировать один неполный кадр данных на основе полного кадра данных

if (preg_match("/[0-9]+%/", $string, $matches)) {
    $percentage = $matches[0];
    echo $percentage;
}
1
задан Victor Zuanazzi 5 March 2019 в 08:01
поделиться

1 ответ

Добро пожаловать в pandas! Это довольно трудная проблема, потому что похоже, что вы хотите делать сравнения 1e5 * 1e5, что не будет быстрым, независимо от того, что мы делаем, поэтому давайте попробуем ограничить это как можно больше. Во-первых, сделайте все возможное, чтобы разумно ожидать, что соответствующие индексы будут близки. Во-вторых, вот код, который немного упростит ваше сопоставление.

Для двух серий x_row и y_row:

> x_row = pd.Series([1, 2, 0, 4])
> y_row = pd.Series([1, 2, 3, 4])
> ((x_row == y_row) | (x_row == 0)).all()
True

Эта последняя строка является побитовой или (|) между двумя проверками: сначала, если каждое значение соответствует соответствующему значению в другой серии (T, T, F, T) или значение в x_row равно нулю (F F T F). Битовый или из этих двух логических рядов равен T T T T, поэтому в результате получается .all() Истина.

Вот пример использования этого в контексте, а также попытка ограничить число сравнений, выполняя только строку y_df из прогона, как только найдено ее соответствие. В идеальном случае это будет выполняться столько раз, сколько у вас будет строк.

x2y = []
unmatched_x = []
unmatched_y = df_y.index.tolist()
for x_idx, x_row in df_x:
    match = False
    for y_idx in unmatched_y:
        if ((x_row == df_y.loc[y_idx]) | (x_row == 0)).all():
            match = True
            break
    if match:
        unmatched_y.remove(y_idx)
        x2y.append(x_idx, y_idx)
    else:
        unmatched_x.append(x_idx)

Если вы думаете, что большинство из них совпадают, вы можете отсортировать те, которые делают, запустив

matches = ((df_x == df_y) | (df_x == 0)).all(axis=1)

Это делает то же самое, но на весь фрейм данных сразу. Он вернет последовательность логических значений, соответствующую тому, соответствует ли каждая строка в df_x соответствующей строке в df_y. Тогда вы можете сортировать тех, кто этого не делает.
df_x[matches] будут только строки, которые соответствуют, или df_x[~matches] будут те, которые не соответствуют.

0
ответ дан P Maschhoff 5 March 2019 в 08:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: