同じ(連続していない)インデックスを持つ2つのSeries s1
とs2
があります。 s1
とs2
を組み合わせてDataFrameの2つの列にし、インデックスの1つを3番目の列として保持するにはどうすればよいですか。
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シリーズ以上に拡張されます。
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
両方が同じインデックスを持っているなら、なぜあなたは単に.to_frameを使わないのですか?
> = v0.23
a.to_frame().join(b)
<v0.23
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})
Pandasでは、値としてDataFrame
、キーとして列名を使用して、dict
からSeries
を作成できます。値としてSeries
が見つかると、Series
インデックスの一部としてDataFrame
インデックスを使用します。このデータ配置は、Pandasの主な利点の1つです。その結果、他に必要がない限り、新しく作成されたDataFrame
は重複した値を持ちます。上記の例では、data['idx_col']
はdata.index
と同じデータを持ちます。
私はあなたの質問を完全に理解しているかどうかわからないが、これはあなたがやりたいことなのか?
pd.DataFrame(data=dict(s1=s1, s2=s2), index=s1.index)
(index=s1.index
はここでも必要ありません)
join()
に基づくソリューションの単純化:
df = a.to_frame().join(b)
私がこれに答えるかもしれないならば。
シリーズをデータフレームに変換することの背後にある基本は、それを理解することです。
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)