パンダで2つのシリーズをDataFrameに結合する


277

2つのシリーズがs1ありs2、同じ(非連続)インデックスがあります。どのように私は組み合わせないs1s2データフレーム内の2つの列であることにし、3列目と指標の一つを保ちますか?

回答:


415

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


5
これは実際に(dictソリューションと比較して)コピーも回避します
Jeff

ある場合には、 'ValueError:複数の要素を持つ配列の真理値があいまいです。a.any()またはa.all() 'を使用してください。
user7289 2013

@ user7289それがどこから来るのかわからないので、これを別の質問として尋ねてもらえますか?
アンディヘイデン

@AndyHayden:1つまたは両方のインデックスに沿って重複がある場合はどうなりますか?
Mannaggia 2014

2
@dafinguzmanが「この関数を常に再利用する」とは、何度も連結するのではなく、一度 連結するのと同じようにすることを意味します。pd.concat([list_of_dataframes])new_df = pd.DataFrame(); for df in list_of_dsf: new_df = pd.concat([new_df, df])
アンディヘイデン

38

両方に同じインデックスがある場合、なぜ.to_frameを使用しないのですか?

> = v0.23

a.to_frame().join(b)

< v0.23

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

4
多分これはより適切でしょう:a.to_frame(name = 'a')。join(b.to_frame(name = 'b'))
user3282777

33

パンダは、連続して渡されたこれらを自動的に整列させ、結合インデックスを作成します。これらはここでも同じです。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

16

コード例:

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からしdictSeries値とキーとしてカラム名として。Series値としてa が見つかるSeriesと、DataFrameインデックスの一部としてインデックスを使用します。このデータ調整は、パンダの主要な特典の1つです。したがって、他のニーズがない限り、新しく作成されたDataFrame値は重複しています。上記の例でdata['idx_col']は、はと同じデータを持っていdata.indexます。


13

これに答えてもいいですか。

シリーズをデータフレームに変換する背後にある基本は、

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)

6

私はあなたの質問を完全に理解しているのかわかりませんが、これはあなたがしたいことですか?

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

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



1

私はパンダを使用して私のnumpy配列またはiseriesをデータフレームに変換し、「予測」としてキーによって列を追加および追加しました。データフレームをリストに変換し直す必要がある場合は、values.tolist()を使用します

output=pd.DataFrame(X_test)
output['prediction']=y_pred

list=output.values.tolist()     
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.