Фильтр pandas df нескольких столбцов из серии pandas - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть фрейм данных, из которого я должен извлечь уникальные значения, чтобы создать некоторые разделы. У меня есть эта часть, и я могу получить небольшой фрейм данных, где каждая строка является определенным разделом. Проблема, с которой я столкнулся, заключается в том, что мне нужно отфильтровать исходный кадр данных только для соответствующих данных (без изменения исходного кадра, чтобы я мог отфильтровать все значения), чтобы я мог отправить его на S3.

У меня есть проблема фильтрации кадра данных на основе ряда из небольшого кадра данных.

вот мой код:

        df_partitions = df.groupby(['grid_id', 'case_id', 'snapshot_year', 'snapshot_month', 'snapshot_day']).size().reset_index()
        df_parts = df_partitions[['grid_id', 'case_id', 'snapshot_year', 'snapshot_month', 'snapshot_day']]

        for index, row in df_parts.iterrows() :
            dest_key_name = '/rec/{}/{}/{}/{}/{}/{}/{}'.format(row['grid_id'], row['case_id'],
                                                               row['snapshot_year'], row['snapshot_month'],
                                                               row['snapshot_day'], file_partition_time,
                                                               'df.csv')
            df_test = df
            filter_df = df_test[(df_test['grid_id'] == row['grid_id'] &
                                 df_test['case_id'] == row['case_id'] &
                                 df_test['snapshot_year'] == row['snapshot_year'] &
                                 df_test['snapshot_month'] == row['snapshot_month'] &
                                 df_test['snapshot_day'] == row['snapshot_day'])]
            print(filter_df)

вот ошибка:

Traceback (most recent call last):
  File "<input>", line 8, in <module>
  File "/local/workspace/FinBIPortal/env/RenewableEnergyValuationLambda-1.0/runtime/lib/python3.6/site-packages/pandas/core/ops.py", line 954, in wrapper
    na_op(self.values, other),
  File "/local/workspace/FinBIPortal/env/RenewableEnergyValuationLambda-1.0/runtime/lib/python3.6/site-packages/pandas/core/ops.py", line 924, in na_op
    raise TypeError(msg)
TypeError: cannot compare a dtyped [object] array with a scalar of type [bool]

Я также пытался

filters_df = df[row]

здесь ошибка:

KeyError: "['pjm' 'base' 2020 2 21] not in index"

и

df_test = df
i1 = df_test.set_index(row).index
i2 = df_parts.set_index(row).index
filter_df = df_test[~i1.isin(i2)]

ошибка:

Traceback (most recent call last):
  File "<input>", line 7, in <module>
  File "/local/workspace/FinBIPortal/env/RenewableEnergyValuationLambda-1.0/runtime/lib/python3.6/site-packages/pandas/core/frame.py", line 3164, in set_index
    frame.index = index
  File "/local/workspace/FinBIPortal/env/RenewableEnergyValuationLambda-1.0/runtime/lib/python3.6/site-packages/pandas/core/generic.py", line 3627, in __setattr__
    return object.__setattr__(self, name, value)
  File "pandas/_libs/properties.pyx", line 69, in pandas._libs.properties.AxisProperty.__set__
  File "/local/workspace/FinBIPortal/env/RenewableEnergyValuationLambda-1.0/runtime/lib/python3.6/site-packages/pandas/core/generic.py", line 559, in _set_axis
    self._data.set_axis(axis, labels)
  File "/local/workspace/FinBIPortal/env/RenewableEnergyValuationLambda-1.0/runtime/lib/python3.6/site-packages/pandas/core/internals.py", line 3074, in set_axis
    (old_len, new_len))
ValueError: Length mismatch: Expected axis has 130 elements, new values have 5 elements

1 Ответ

0 голосов
/ 22 февраля 2020

Очень простое решение здесь. Формат фильтрации по нескольким критериям - df[(...)&(...)], а вы пытаетесь df[(... & ... )]. Закройте те круглые скобки, где вы устанавливаете filter_df.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...