Подзаголовок: Тупые панды, перестаньте умничать.
У меня есть список (res
) фреймов данных pandas с одним столбцом, каждый из которых содержит одинаковые числовые данные, но каждый с другим именем столбца. Индексы строк не имеют значения. Я хочу поместить их в один очень длинный фрейм данных с одним столбцом.
Когда я делаю pd.concat(res)
, я получаю один столбец для каждого входного файла (и загружаю и загружаю ячейки NaN). Я пробовал разные значения для параметров (*), но ни один из них не делает то, что мне нужно.
Изменить: Пример данных:
res = [
pd.DataFrame({'A':[1,2,3]}),
pd.DataFrame({'B':[9,8,7,6,5,4]}),
pd.DataFrame({'C':[100,200,300,400]}),
]
У меня есть уродливое решение: скопировать каждый фрейм данных и присвоить ему новое имя столбца:
newList = []
for r in res:
r.columns = ["same"]
newList.append(r)
pd.concat( newList, ignore_index=True )
Наверняка это не лучший способ сделать это??
Кстати, pandas: кадр данных concat с другим именем столбца похож, но мой вопрос еще проще, так как я не хотите, чтобы индекс сохранялся. (Я также начинаю со списка из N фреймов данных с одним столбцом, а не с одного фрейма данных из N столбцов.)
*: например. axis=0
— поведение по умолчанию. axis=1
выдает ошибку. join="inner"
просто глупо (я получаю только индекс). ignore_index=True
перенумеровывает индекс, но я все еще получаю много столбцов, много NaN.
ОБНОВЛЕНИЕ для пустых списков
У меня были проблемы (со всеми указанными решениями), когда у данных был пустой список, например:
res = [
pd.DataFrame({'A':[1,2,3]}),
pd.DataFrame({'B':[9,8,7,6,5,4]}),
pd.DataFrame({'C':[]}),
pd.DataFrame({'D':[100,200,300,400]}),
]
Хитрость заключалась в том, чтобы форсировать тип, добавляя .astype('float64')
. Например.
pd.Series(np.concatenate([df.values.ravel().astype('float64') for df in res]))
or:
pd.concat(res,axis=0).astype('float64').stack().reset_index(drop=True)