Объединить список фреймов данных, которые соответствуют шаблону регулярных выражений - pandas - PullRequest
0 голосов
/ 26 февраля 2020

I sh, чтобы объединить множество различных фреймов данных с именами, которые соответствуют шаблону регулярного выражения. (НЕ имена столбцов, я имею в виду имя самого кадра данных).

С благодарностью за принятый ответ на этой странице , Я могу получить желаемый результат с помощью:

reduce(lambda x, y: pd.merge(x, y, on = 'variable'), [df1, df2, df3])

Но набрать их все довольно утомительно. Все мои нужные фреймы данных помечены префиксом «m_», поэтому я надеялся, что будет простой способ использования регулярных выражений для сопоставления всех моих фреймов данных с использованием «^ m _» .

В надежде предоставить больше контекста, Я уже написал сообщение об этой проблеме в RStudio . На самом деле, я уже знал, как это сделать в R, но этот вопрос касался того, как вставить весь код в мою собственную функцию (что я также хотел бы знать, как это сделать в этой ситуации). Так что, если это поможет каким-либо образом, это точный эквивалент R того, что я пытаюсь сделать:

Reduce(function(...) merge(..., all = TRUE), mget(apropos("^m_")))

И, если возможно, сделайте из этого свою собственную функцию, как это (но все еще делает это с python вместо этого):

multi.merge <- function(pattern){
    Reduce(function(...) merge(..., all = TRUE), mget(apropos(pattern), envir=.GlobalEnv))
}
output <- multi.merge("^m_")

Но если вы не знаете, что все это значит в R, надеюсь, мой желаемый результат все еще ясен.

1 Ответ

1 голос
/ 26 февраля 2020

Это должно сделать это:

def global_pd_dfs(pattern=None, return_values=False):
    dct = globals()
    if pattern is None:
        return [dct[x] if return_values else x for x in dct.keys() if type(dct[x]) == pd.core.frame.DataFrame]
    else:
        pattern = re.compile(pattern)
        return [dct[x] if return_values else x for x in dct.keys() if type(dct[x]) == pd.core.frame.DataFrame and pattern.match(x)]

def multi_merge(pattern=None):
    return reduce(lambda x, y: pd.merge(x, y, on = 'variable'), global_pd_dfs(pattern=pattern, return_values = True))

Если шаблон не указан, global_pd_dfs() перечисляет все pandas dfs в глобальной среде. И multi_merge() попытается объединить все pandas dfs в глобальной среде.

R * ls() может быть имитирован Питонами globals(), однако последний из них - словарь.

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