pandasTweet二次元データを表すpandas.DataFrameと一次元データを表すpandas.Seriesを相互に変換する方法を説明する。便宜上「変換」という言葉を使っているが、正しくは、pandas.DataFrameの列や行をpandas.Seriesとして取得したり、単独あるいは複数のpandas.Seriesをもとにpandas.DataFrameを生成したりする処理となる。ここでは以下の内容について説明する。最後に説明するように、元のオブジェクトと取得・生成したオブジェクトがメモリを共有し、いずれかの要素を変更すると他方の要素も変更されることがある。それぞれのオブジェクトを別々に扱いたい場合は注意。pandas.DataFrameおよびpandas.SeriesをNumPy配列numpy.ndarrayやPython組み込みのリスト型と相互に変換する方法については以下の記事を参照。以下のサンプルコードのpandasのバージョンは0.25.3。バージョンが異なると振る舞いが異なるかもしれない。iloc[](列番号・行番号で指定)を使ってpandas.DataFrameの一行・一列を選択すると、pandas.Seriesとして取得できる。iloc[]についての詳細は以下の記事を参照。iloc例として、以下のpandas.DataFrameを使う。pandas_dataframe_to_series.pypandas.DataFrameの列をpandas.Seriesとして取得df[列名]で列名を指定すると、その列をpandas.Seriesとして取得できる。pandas_dataframe_to_series.pyloc[]で列名、iloc[]で列番号をスカラー値で指定しても同様。pandas.Seriesとして取得できる。pandas_dataframe_to_series.py上の例のように行を:で全体を指定するのではなく、リストやスライスで任意の要素のみを選択することも可能。pandas_dataframe_to_series.py列の選択にリストやスライスを使う場合は一列分を選択してもpandas.Seriesではなくpandas.DataFrameとなるので注意。行を選択する場合も同様。loc[]で行名、iloc[]で行番号をスカラー値で指定するとpandas.Seriesとして取得できる。pandas_dataframe_to_series.py全体を指定する場合、列の指定の:は省略可能。pandas_dataframe_to_series.pyリストやスライスで任意の要素のみを選択することもできる。pandas_dataframe_to_series.py行の場合と同様、リストやスライスで一行分を選択するとpandas.Seriesではなくpandas.DataFrameとなる。pandas_dataframe_to_series.pydf[スライス]で行を選択することもできるが、これで一行分を選択した場合もpandas.DataFrame。pandas_dataframe_to_series.pyデータ型に注意pandas.DataFrameは列ごとにデータ型dtypeを保持するのに対し、pandas.Seriesは全体で一つのデータ型となる。pandasのデータ型dtype一覧とastypeによる変換(キャスト)上の例ではデータ型がobjectとなっていた。pandas_dataframe_to_series.pyobjectでは要素自体は様々な型をとれるので各要素は元の型のまま。pandas_dataframe_to_series.py上の例のように元のpandas.DataFrameに文字列の列が含まれている場合はobjectとなるが、整数intや浮動小数点数floatなど数値の列のみの場合は注意が必要。以下のように、暗黙のキャスト(型変換)が行われる。pandas_dataframe_to_series.py値が変わることはないが、例えば、キャストされた要素をintだと思ってインデックス[]に指定するとfloatに変わっていてエラーになったりすることがあるので要注意。pandas.Seriesをpandas.DataFrameに変換pandas.DataFrameのコンストラクタにpandas.Seriesを渡すと、pandas.Seriesを列とするpandas.DataFrameが生成される。pandas_series_to_dataframe.pypandas.Seriesを要素とするリストを指定すると、元のpandas.Seriesが行となる。pandas_series_to_dataframe.pypandas.Seriesの属性nameが設定されている場合、nameが列名・行名となる。複数のpandas.Seriesを連結してpandas.DataFrameを生成することも可能。以下の例では2つのpandas.Seriesの場合を示すが、3つ以上でも同じ。上の例と同様にコンストラクタpandas.DataFrame()を使う。pandas_series_to_dataframe.py上の結果から分かるように、異なるデータ型dtypeのpandas.Seriesを行とする場合、暗黙の型変換が行われるので注意。pd.concat()を利用する方法もある。pandas_series_to_dataframe.py元のpandas.Seriesに属性nameが設定されている場合。pandas_series_to_dataframe.pyコンストラクタに辞書で指定する場合は明示的に列名を指定する必要がある。pandas_series_to_dataframe.pyコンストラクタにpandas.Seriesを要素とするリストを指定する場合とpd.concat()で連結する場合は、自動的にnameが列名や行名となる。pandas_series_to_dataframe.pyインデックスが異なる場合これまでの例のように、複数のpandas.Seriesからpandas.DataFrameを生成する場合、インデックス(ラベル)indexを元にpandas.DataFrameが生成される。異なるインデックスを持つpandas.Seriesだと、欠損値NaNが生じる。pandas_series_to_dataframe.pypandasにおける欠損値の処理については以下の記事を参照。pandasで欠損値NaNを除外(削除)・置換(穴埋め)・抽出pd.concat()では、join='inner'とすることで共通するインデックスのみを残すことができる。pandas_series_to_dataframe.pyインデックスを無視したい場合、pandas.Seriesのvalues属性でnumpy.ndarrayを取得して使う方法がある。pd.concat()ではエラーになるので注意。pandas_series_to_dataframe.pypandas.Seriesとnumpy.ndarrayが混在している場合の振る舞いはコンストラクタへの指定方法によって異なる。pandas_series_to_dataframe.pyコンストラクタの引数indexやcolumnsに所望のインデックスを明示的に指定するほうが間違いは少ないかもしれない。要素数が異なる場合もデフォルトではindexを元にpandas.DataFrameが生成される。足りない分はNaNとなる。pandas_series_to_dataframe.pyvalues属性(numpy.ndarray)に対する振る舞いはコンストラクタへの指定方法によって異なる。pandas_series_to_dataframe.pynumpy.ndarrayをさらにPython組み込みのリストに変換して要素を加えて要素数を揃える、という方法もあるが、適当なindexを設定してから欠損値NaNを処理するほうが簡単。pandas_series_to_dataframe.pyビューとコピーpandas.DataFrameの行や列をpandas.Seriesとして取得する場合、pandas.Seriesは元のpandas.DataFrameのビューとなる。pandas.DataFrameとpandas.Seriesはメモリを共有し、いずれかの要素を変更すると他方の要素も変更される。pandas_dataframe_to_series.py別々に扱いたい場合はcopy()でコピーを生成する。pandas_dataframe_to_series.pyなお、リストを使って特定の要素のみを取り出すような場合はビューではなくコピーが生成されることもある。pandas_dataframe_to_series.pyビューが生成されるかコピーが生成されるかを判定する手段はないので要注意。詳細は以下の記事を参照。pandas.DataFrameにおけるビューとコピーpandas.Seriesからpandas.DataFrameを生成する場合も同様。コンストラクタpd.DataFrame()はデフォルトでは可能な限りビューを返す。pandas_series_to_dataframe.py引数copy=Trueとするとコピーが生成される。デフォルトはcopy=False。pandas_series_to_dataframe.pypd.concat()ではデフォルトでコピーが返される。pandas_series_to_dataframe.pypd.concat()にも引数copyがあるが、copy=Falseとしても必ずビューが生成されるとは限らない。pandas_series_to_dataframe.pyコンストラクタpd.DataFrame()を含め、引数copyが提供されている関数やメソッドにおいて、copy=Trueとすると必ずコピーが生成されるが、copy=Falseでは可能な限りビューを生成するという処理になる。copy=Falseであっても、メモリレイアウト上、不可能な場合はビューではなくコピーとなる。ビューが生成されるとは限らないので注意。