54369


こんにちは。  
series同士の結合について質問があります。  
表Aと表Bの結合を行おうと、pd.concat([A,B])とすると、  
表Cのように、行追加の形で行われてしまいます。  
列結合を行うにはどうしたらよいのでしょうか？  
（日付、みかん、りんごのように並ぶイメージです。）

ネットで見ると、恐らく表A、表Bの価格にカラム名がついていないから、  
同一カラムと見なされ、下に追加される形になると思うのですが、  
series型でのカラム名のつけ方がいまいちわかりません。。。。

[code]

    表A
    日付　
    4/1 100
    4/2 200
    4/3 300
    
    表B
    4/1 200
    4/3 500
    
    表C
    4/1 100
    4/2 200
    4/3 300
    4/1 200
    4/3 500
    
[/code]


CC BY-SA 4.0
2019-04-20T02:35:36.983
54327
2019-04-22T00:23:05.707
2019-04-21T16:23:56.053
3060
31764
question
python python3 pandas
pandas series同士の結合について

[code]

    import pandas as pd
    
    pd.DataFrame({'日付': s1, 'みかん': s2, 'りんご': s3})
    
[/code]

のように、 DataFrame を普通に新規に作成することが、質問者様のやりたいことだと思っていますが、いかがでしょうか？


CC BY-SA 4.0
2019-04-20T04:57:06.513
54330
2019-04-20T04:57:06.513
754
54327
answer


**やり直し回答**

`concat` だと @magichan さんの方式ですが、  
他には単純に DataFrame を作って配列として代入するやり方があるようです。  
[python
pandasでの列（column）へのSeriesの追加](https://qiita.com/mu-777/items/e5c193af6b026a8b8ec5)  
これだとカラム名を付けなくても出来ます。Series作成は@magichanさん回答からコピー

[code]

    import pandas as pd
    
    ser1 = pd.Series([100,200,300],index=['4/1','4/2','4/3'])
    ser2 = pd.Series([200,500],index=['4/1','4/3'])
    
    df = pd.DataFrame()
    df[1] = ser1
    df[2] = ser2
    print(df)
    
[/code]

結果はこうなります。

[code]

           1      2
    4/1  100  200.0
    4/2  200    NaN
    4/3  300  500.0
    
[/code]

**注**  
ただし、最初に代入するデータは、インデックスが文字列(数値でない?)の場合、全部のインデックスに対応するデータが揃っている必要があるようです。例えば 表B
に '4/4' 200 といった 表A に無いデータがある場合は追加されません。

* * *

**質問を誤解してました：以下はDataFrame同士の処理です**

やりたいことは `concat` ではなく、`merge` ではないでしょうか？

[code]

    import pandas as pd
    
    df1 = pd.DataFrame([['4/1',100],['4/2',200],['4/3',300]], columns=(['日付','みかん']))
    df2 = pd.DataFrame([['4/1',200],['4/3',500]], columns=(['日付','りんご']))
    df3 = pd.merge(df1, df2, on='日付', how='outer')
    df3.fillna(0, inplace=True)
    df3 = df3.astype({'みかん':int, 'りんご':int})
    print(df3)
    
[/code]

とすると、結果が以下になります。こんな形が欲しいのでは？

[code]

        日付  みかん  りんご
    0  4/1  100  200
    1  4/2  200    0
    2  4/3  300  500
    
[/code]

* * *

ちなみに `merge` の行を `concat` に変えると以下になります。

[code]

    df3 = pd.concat([df1, df2], axis=1)
    
[/code]

結果はこうなります。

[code]

        日付  みかん   日付  りんご
    0  4/1  100  4/1  200
    1  4/2  200  4/3  500
    2  4/3  300    0    0
    
[/code]


CC BY-SA 4.0
2019-04-20T05:04:31.380
54331
2019-04-22T00:23:05.707
2019-04-22T00:23:05.707
26370
26370
54327
answer


> 列結合を行うにはどうしたらよいのでしょうか？

pandas.concat() のパラメータに `axis=1` を指定してください。  
<https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.concat.html>

> ネットで見ると、恐らく表A、表Bの価格にカラム名がついていないから、同一カラムを見なされ、下に追加される形になると思うのですが、

同名のSeries同志でも列方向の結合はできます。

> series型でのカラム名のつけ方がいまいちわかりません。。。。

`Series.rename()` をご使用ください。  
<https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.Series.rename.html>

[code]

    import pandas as pd
    
    ser1 = pd.Series([100,200,300],index=['4/1','4/2','4/3'])
    ser2 = pd.Series([200,500],index=['4/1','4/3'])
    
    pd.concat((ser1.rename('みかん'), ser2.rename('りんご')),axis=1,sort=False)
    #     みかん  りんご
    #4/1  100     200.0
    #4/2  200       NaN
    #4/3  300     500.0
    
[/code]


CC BY-SA 4.0
2019-04-21T16:20:19.680
54369
2019-04-21T16:20:19.680
24801
54327
answer