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)
Ответы
Ответ 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
исправил это для меня.