У меня есть две серии s1
и s2
с теми же (не последовательными) индексами. Как объединить s1
и s2
в два столбца в DataFrame и сохранить один из индексов в качестве третьего столбца?
Объединение двух рядов в DataFrame в pandas
Ответ 1
Я думаю, concat
- хороший способ сделать это. Если они присутствуют, они используют атрибуты имени Серии в качестве столбцов (иначе они просто их номера):
In [1]: s1 = pd.Series([1, 2], index=['A', 'B'], name='s1')
In [2]: s2 = pd.Series([3, 4], index=['A', 'B'], name='s2')
In [3]: pd.concat([s1, s2], axis=1)
Out[3]:
s1 s2
A 1 3
B 2 4
In [4]: pd.concat([s1, s2], axis=1).reset_index()
Out[4]:
index s1 s2
0 A 1 3
1 B 2 4
Примечание. Это распространяется на более чем 2 серии.
Ответ 2
Pandas будет автоматически выровнять их последовательно и создать общий индекс
Они, оказывается, здесь одинаковы. reset_index
перемещает индекс в столбец.
In [2]: s1 = Series(randn(5),index=[1,2,4,5,6])
In [4]: s2 = Series(randn(5),index=[1,2,4,5,6])
In [8]: DataFrame(dict(s1 = s1, s2 = s2)).reset_index()
Out[8]:
index s1 s2
0 1 -0.176143 0.128635
1 2 -1.286470 0.908497
2 4 -0.995881 0.528050
3 5 0.402241 0.458870
4 6 0.380457 0.072251
Ответ 3
Почему бы вам просто не использовать .to_frame, если оба имеют одинаковые индексы?
> = v0.23
a.to_frame().join(b)
< v0.23
a.to_frame().join(b.to_frame())
Ответ 4
Пример кода:
a = pd.Series([1,2,3,4], index=[7,2,8,9])
b = pd.Series([5,6,7,8], index=[7,2,8,9])
data = pd.DataFrame({'a': a,'b':b, 'idx_col':a.index})
Pandas позволяет вам создать DataFrame
из dict
с Series
в качестве значений и имен столбцов в качестве ключей. Когда он находит значение Series
в качестве значения, он использует индекс Series
как часть индекса DataFrame
. Это выравнивание данных является одним из основных преимуществ Pandas. Следовательно, если у вас нет других потребностей, только что созданное DataFrame
имеет дублирующее значение. В приведенном выше примере data['idx_col']
имеет те же данные, что и data.index
.
Ответ 5
Не уверен, что я полностью понимаю ваш вопрос, но это то, что вы хотите сделать?
pd.DataFrame(data=dict(s1=s1, s2=s2), index=s1.index)
(index=s1.index
здесь даже не требуется)
Ответ 6
Упрощение решения на основе join()
:
df = a.to_frame().join(b)
Ответ 7
Если я могу ответить на это.
Основы, лежащие в основе преобразования ряда в фрейм данных, - это понимание того, что
1. На концептуальном уровне каждый столбец во фрейме данных является серией.
2. И каждое имя столбца является ключевым именем, которое сопоставляется с серией.
Если вы помните о двух вышеизложенных понятиях, вы можете придумать множество способов преобразования рядов во фрейм данных. Одно простое решение будет таким:
Создайте две серии здесь
import pandas as pd
series_1 = pd.Series(list(range(10)))
series_2 = pd.Series(list(range(20,30)))
Создайте пустой фрейм данных с нужными именами столбцов
df = pd.DataFrame(columns = ['Column_name#1', 'Column_name#1'])
Поместите значение ряда в кадр данных, используя концепцию отображения
df['Column_name#1'] = series_1
df['Column_name#2'] = series_2
Проверьте результаты сейчас
df.head(5)