#pandas
Вопрос:
У меня есть список pd.Series
с различными индексами дат и именами как таковыми:
trade_date
2007-01-03 0.049259
2007-01-04 0.047454
2007-01-05 0.057485
2007-01-08 0.059216
2007-01-09 0.055359
...
2013-12-24 0.021048
2013-12-26 0.021671
2013-12-27 0.017898
2013-12-30 0.034071
2013-12-31 0.022301
Name: name1, Length: 1762, dtype: float64
Я хочу объединить этот список серий в фрейм данных, где каждый Name
становится столбцом в имени данных, а все отсутствующие индексы задаются как nan.
Когда я пытаюсь pd.concat(list_data)
, вместо этого я получаю одну действительно большую серию. Если я создам пустой фрейм данных и сделаю цикл над каждой серией в своем списке, я получу ошибку ValueError: cannot reindex from a duplicate axis
Как я могу объединить их в игру с данными?
Комментарии:
1. Можете ли вы привести минимальный пример, для которого вы воспроизводите ошибку?
2. Может быть, pd.concat(list_data, ось=1)?
Ответ №1:
Воспользуйся:
pd.concat(map(lambda s: s.groupby(level=0).last(), list_data), axis=1)
более старый ответ
Вы должны использовать axis=1
в pandas.concat
:
pd.concat([series1, series2, series3], axis=1)
пример ваших данных (при условии, что это предоставленная серия):
pd.concat([s, (s 1).rename('name2').iloc[5:]], axis=1)
выход:
name1 name2
trade_date
2007-01-03 0.049259 NaN
2007-01-04 0.047454 NaN
2007-01-05 0.057485 NaN
2007-01-08 0.059216 NaN
2007-01-09 0.055359 NaN
2013-12-24 0.021048 1.021048
2013-12-26 0.021671 1.021671
2013-12-27 0.017898 1.017898
2013-12-30 0.034071 1.034071
2013-12-31 0.022301 1.022301
Комментарии:
1. Я получаю следующую ошибку
ValueError: cannot reindex from a duplicate axis
2. @pyCthon как? пожалуйста, приведите пример, это означает, что у вас где-то есть дубликат индекса. Кроме того, проверьте мои обновления.
3. Это обновление работает! Извините, я должен был уточнить, что индексы были разными датами в каждой серии
4. @pyCthon имейте в виду, что обновление удаляет дубликаты индексов! (сохраняет последний дубликат)
Ответ №2:
Вам нужно объединить столбцы (объединить ряды по горизонтали):
pd.concat(list_data, axis=1)
Ответ №3:
Вероятно, у вас есть несколько строк с одним и тем же индексом даты на каждую Series
.
Чтобы устранить эту проблему, вы можете сделать:
for sr in list_data:
sr = sr[sr.index.value_counts() > 1]
if len(sr):
print(f'[sr.name]')
print(sr, end='n')
Если есть выход, вы не можете его использовать concat
. Возможно, вам придется использовать merge
параметр with how='outer'
в качестве параметра.