Объединение двух серий в фрейм данных в панд


у меня есть две серии s1 и s2 с одинаковыми (не последовательными) индексами. Как мне комбинировать s1 и s2 чтобы быть двумя столбцами в фрейме данных и сохранить один из индексов в качестве третьего столбца?

6 174

6 ответов:

Я думаю 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 серии.

панды автоматически выровняют эти пройденные последовательно и создадут совместный индекс Так уж получилось, что и здесь они одинаковы. 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

почему бы вам просто не использовать .to_frame, если оба имеют одинаковые индексы?

a.to_frame().join(b.to_frame())

^^ Это не будет работать, если пытаться "присоединиться" к двум сериям панд

пример кода:

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})

панды позволяет создать DataFrame С dict С Series как значения и имена столбцов в качестве ключей. Когда он находит Series в качестве значения он использует в рамках . Это выравнивание данных является одним из основных преимуществ панд. Следовательно, если у вас нет других потребностей, то свежесозданный DataFrame повторяющиеся значения. В приведенном выше примере data['idx_col'] имеет те же данные, что и data.index.

упрощение решения на основе join():

df = a.to_frame().join(b)

Не уверен, я полностью понимаю ваш вопрос, но это то, что вы хотите сделать?

pd.DataFrame(data=dict(s1=s1, s2=s2), index=s1.index)

(index=s1.index здесь даже не нужно)