web-dev-qa-db-ja.com

2つのシリーズをパンダでDataFrameに組み合わせる

同じ(連続していない)インデックスを持つ2つのSeries s1s2があります。 s1s2を組み合わせてDataFrameの2つの列にし、インデックスの1つを3番目の列として保持するにはどうすればよいですか。

209
user7289

concat はこれを行うのに良い方法だと思います。存在する場合は、列としてSeriesの名前属性を使用します(それ以外の場合は単純に番号を付けます)。

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シリーズ以上に拡張されます。

320
Andy Hayden

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
31
Jeff

両方が同じインデックスを持っているなら、なぜあなたは単に.to_frameを使わないのですか?

> = v0.23

a.to_frame().join(b)

<v0.23

a.to_frame().join(b.to_frame())
21
swmfg

コード例:

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の主な利点の1つです。その結果、他に必要がない限り、新しく作成されたDataFrameは重複した値を持ちます。上記の例では、data['idx_col']data.indexと同じデータを持ちます。

10
jbn

私はあなたの質問を完全に理解しているかどうかわからないが、これはあなたがやりたいことなのか?

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

index=s1.indexはここでも必要ありません)

4
Bertrand L

join()に基づくソリューションの単純化:

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

私がこれに答えるかもしれないならば。

シリーズをデータフレームに変換することの背後にある基本は、それを理解することです。

1.概念レベルでは、データフレーム内のすべての列はシリーズです。

2.そして、すべての列名はシリーズにマップされるキー名です。

上記の2つの概念を念頭に置いておくと、系列をデータフレームに変換する多くの方法を考えることができます。 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)
1
Sateesh