Подтвердить что ты не робот

Pandas concat выдает ValueError: фигуры плана не выровнены

Я новичок в пандах, я пытаюсь объединить набор данных, и я получаю эту ошибку:

ValueError: Plan shapes are not aligned

.concat() я понимаю, .concat() состоит в том, что он будет объединяться там, где столбцы одинаковы, но для тех, кого он не может найти, он заполняется символом NA. Кажется, это не так.

Вот конкретное выражение:

dfs = [npo_jun_df, npo_jul_df,npo_may_df,npo_apr_df,npo_feb_df]
alpha = pd.concat(dfs)
4b9b3361

Ответ 1

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

Я не знаю, мог ли этот ответ решить проблему OP (поскольку он/она не размещал достаточно информации), но для меня это было вызвано, когда я попытался concat dataframe df1 с столбцами ['A', 'B', 'B', 'C'] (см. повторяющиеся заголовки столбцов?) с dataframe df2 с столбцами ['A', 'B']. Понятно, что дублирование заставило pandas бросить шаткое. Измените df1 на ['A', 'B', 'C'] (т.е. Удалите один из повторяющихся столбцов), и все будет хорошо.

Ответ 2

Недавно я получил это сообщение, и я нашел его как user @jason и @user3805082 выше что у меня были дубликаты столбцов в нескольких сотнях ядровых кадров, которые я пытался concat, каждый из которых имел десятки загадочных имен. Вручную поиск дубликатов не был практичным.

Если у кого-то еще такая же проблема, я написал следующую функцию, которая может помочь.

def duplicated_varnames(df):
    """Return a dict of all variable names that 
    are duplicated in a given dataframe."""
    repeat_dict = {}
    var_list = list(df) # list of varnames as strings
    for varname in var_list:
        # make a list of all instances of that varname
        test_list = [v for v in var_list if v == varname] 
        # if more than one instance, report duplications in repeat_dict
        if len(test_list) > 1: 
            repeat_dict[varname] = len(test_list)
    return repeat_dict

Затем вы можете перебирать этот dict, чтобы сообщить, сколько дубликатов есть, удалить дублированные переменные или переименовать их каким-то систематическим образом.

Ответ 3

Написал небольшую функцию для объединения дублированных имен столбцов. Функция заботится о сортировке, если исходный формат данных несортирован, выход будет отсортированным.

def concat_duplicate_columns(df):
    dupli = {}
    # populate dictionary with column names and count for duplicates 
    for column in df.columns:
        dupli[column] = dupli[column] + 1 if column in dupli.keys() else 1
    # rename duplicated keys with °°° number suffix
    for key, val in dict(dupli).items():
        del dupli[key]
        if val > 1:
            for i in range(val):
                dupli[key+'°°°'+str(i)] = val
        else: dupli[key] = 1
    # rename columns so that we can now access abmigous column names
    # sorting in dict is the same as in original table
    df.columns = dupli.keys()
    # for each duplicated column name
    for i in set(re.sub('°°°(.*)','',j) for j in dupli.keys() if '°°°' in j):
        i = str(i)
        # for each duplicate of a column name
        for k in range(dupli[i+'°°°0']-1):
            # concatenate values in duplicated columns
            df[i+'°°°0'] = df[i+'°°°0'].astype(str) + df[i+'°°°'+str(k+1)].astype(str)
            # Drop duplicated columns from which we have aquired data
            df = df.drop(i+'°°°'+str(k+1), 1)
    # resort column names for proper mapping
    df = df.reindex_axis(sorted(df.columns), axis = 1)
    # rename columns
    df.columns = sorted(set(re.sub('°°°(.*)','',i) for i in dupli.keys()))
    return df

Ответ 4

pip install pandas --upgrade исправил это для меня.