スプレッドシートとの比較#

pandasの潜在的なユーザーの多くはExcelのようなスプレッドシートプログラムに多少の馴染みがあるため、このページではpandasを使用してさまざまなスプレッドシート操作をどのように実行するかについていくつかの例を提供することを目的としています。このページではExcelの用語を使用し、Excelのドキュメントへのリンクを提供しますが、Google スプレッドシートLibreOffice CalcApple Numbers、その他のExcel互換のスプレッドシートソフトウェアでも同じか類似している部分が多くあります。

pandasを初めて使用する場合は、まずpandasの10分間を読んで、ライブラリに慣れておくことをお勧めします。

慣例通り、pandasとNumPyを次のようにインポートします。

In [1]: import pandas as pd

In [2]: import numpy as np

データ構造#

一般的な用語の対応#

pandas

Excel

DataFrame

ワークシート

Series

Index

行見出し

NaN

空のセル

DataFrame#

pandasのDataFrameは、Excelのワークシートに似ています。Excelのワークブックには複数のワークシートを含めることができますが、pandasのDataFrameは独立して存在します。

Series#

Seriesは、DataFrameの1つの列を表すデータ構造です。Seriesを操作することは、スプレッドシートの列を参照することに似ています。

Index#

すべてのDataFrameSeriesにはIndexがあり、これはデータののラベルです。pandasでは、インデックスが指定されていない場合、RangeIndexがデフォルトで使用されます(最初の行 = 0、2番目の行 = 1、など)。これはスプレッドシートの行見出し/番号に似ています。

pandasでは、インデックスを1つ(または複数)の一意の値に設定できます。これは、ワークシートで行識別子として使用される列を持つようなものです。ほとんどのスプレッドシートとは異なり、これらのIndex値を使用して、実際に行を参照できます。(これはExcelでは構造化参照で実行できます。)たとえば、スプレッドシートでは最初の行をA1:Z1として参照しますが、pandasではpopulations.loc['Chicago']を使用できます。

インデックス値も永続的であるため、DataFrameの行を並べ替えても、特定の行のラベルは変更されません。

Indexを効果的に使用する方法の詳細については、インデックスのドキュメントを参照してください。

コピーとインプレース操作#

ほとんどのpandas操作は、Series/DataFrameのコピーを返します。変更を「保持」するには、新しい変数に割り当てるか

sorted_df = df.sort_values("col1")

元のものを上書きする必要があります

df = df.sort_values("col1")

注意

一部のメソッドでinplace=Trueまたはcopy=Falseキーワード引数が使用可能になっていることがわかります。

df.replace(5, inplace=True)

ごく一部のメソッド(replaceを含む)を除き、ほとんどのメソッド(たとえば、dropna)でinplacecopyを非推奨化して削除することについて活発な議論があります。Copy-on-Writeのコンテキストでは、どちらのキーワードも不要になります。提案はこちらにあります。

データの入出力#

値からDataFrameを構築する#

スプレッドシートでは、セルに値を直接入力できます

pandasのDataFrameはさまざまな方法で構築できますが、少数の値の場合は、Python辞書として指定すると便利なことがよくあります。ここで、キーは列名、値はデータです。

In [3]: df = pd.DataFrame({"x": [1, 3, 5], "y": [2, 4, 6]})

In [4]: df
Out[4]: 
   x  y
0  1  2
1  3  4
2  5  6

外部データの読み込み#

Excelpandasの両方で、さまざまな形式でさまざまなソースからデータをインポートできます。

CSV#

pandasテストのtipsデータセット(CSVファイル)をロードして表示してみましょう。Excelでは、ダウンロードしてからCSVを開きます。pandasでは、CSVファイルのURLまたはローカルパスをread_csv()に渡します。

In [5]: url = (
   ...:     "https://raw.githubusercontent.com/pandas-dev"
   ...:     "/pandas/main/pandas/tests/io/data/csv/tips.csv"
   ...: )
   ...: 

In [6]: tips = pd.read_csv(url)

In [7]: tips
Out[7]: 
     total_bill   tip     sex smoker   day    time  size
0         16.99  1.01  Female     No   Sun  Dinner     2
1         10.34  1.66    Male     No   Sun  Dinner     3
2         21.01  3.50    Male     No   Sun  Dinner     3
3         23.68  3.31    Male     No   Sun  Dinner     2
4         24.59  3.61  Female     No   Sun  Dinner     4
..          ...   ...     ...    ...   ...     ...   ...
239       29.03  5.92    Male     No   Sat  Dinner     3
240       27.18  2.00  Female    Yes   Sat  Dinner     2
241       22.67  2.00    Male    Yes   Sat  Dinner     2
242       17.82  1.75    Male     No   Sat  Dinner     2
243       18.78  3.00  Female     No  Thur  Dinner     2

[244 rows x 7 columns]

Excelのテキストファイルウィザードのように、read_csvは、データの解析方法を指定するために、多くのパラメーターを受け取ることができます。たとえば、データが代わりにタブ区切りで、列名がなかった場合、pandasコマンドは次のようになります。

tips = pd.read_csv("tips.csv", sep="\t", header=None)

# alternatively, read_table is an alias to read_csv with tab delimiter
tips = pd.read_table("tips.csv", header=None)

Excelファイル#

Excelでは、さまざまなExcelファイル形式をダブルクリックするか、開くメニューを使用して開きます。pandasでは、Excelファイルから/への読み取りと書き込みのための特別なメソッドを使用します。

まず、上記の例のtipsデータフレームに基づいて、新しいExcelファイルを作成しましょう。

tips.to_excel("./tips.xlsx")

その後、tips.xlsxファイル内のデータにアクセスする場合は、以下を使用してモジュールに読み込むことができます。

tips_df = pd.read_excel("./tips.xlsx", index_col=0)

これで、pandasを使用してExcelファイルを読み込みました。

出力の制限#

スプレッドシートプログラムでは、一度に1画面分のデータのみが表示され、スクロールできるようになるため、出力制限の必要性はあまりありません。pandasでは、DataFrameの表示方法を制御するために少し検討する必要があります。

デフォルトでは、pandasは大きなDataFrameの出力を切り捨てて、最初と最後の行を表示します。これは、pandasオプションを変更するか、DataFrame.head()またはDataFrame.tail()を使用することでオーバーライドできます。

In [8]: tips.head(5)
Out[8]: 
   total_bill   tip     sex smoker  day    time  size
0       16.99  1.01  Female     No  Sun  Dinner     2
1       10.34  1.66    Male     No  Sun  Dinner     3
2       21.01  3.50    Male     No  Sun  Dinner     3
3       23.68  3.31    Male     No  Sun  Dinner     2
4       24.59  3.61  Female     No  Sun  Dinner     4

データのエクスポート#

デフォルトでは、デスクトップスプレッドシートソフトウェアは、それぞれのファイル形式(.xlsx.odsなど)で保存します。ただし、他のファイル形式に保存することもできます。

pandasはExcelファイルCSV、または他の多くの形式を作成できます。

データ操作#

列の操作#

スプレッドシートでは、数式は個々のセルで作成され、その後、他の列で計算するために他のセルにドラッグされることがよくあります。pandasでは、列全体に対して直接操作を行うことができます。

pandasは、DataFrame内の個々のSeriesを指定することで、ベクトル化された操作を提供します。新しい列も同様の方法で割り当てることができます。DataFrame.drop()メソッドは、DataFrameから列を削除します。

In [9]: tips["total_bill"] = tips["total_bill"] - 2

In [10]: tips["new_bill"] = tips["total_bill"] / 2

In [11]: tips
Out[11]: 
     total_bill   tip     sex smoker   day    time  size  new_bill
0         14.99  1.01  Female     No   Sun  Dinner     2     7.495
1          8.34  1.66    Male     No   Sun  Dinner     3     4.170
2         19.01  3.50    Male     No   Sun  Dinner     3     9.505
3         21.68  3.31    Male     No   Sun  Dinner     2    10.840
4         22.59  3.61  Female     No   Sun  Dinner     4    11.295
..          ...   ...     ...    ...   ...     ...   ...       ...
239       27.03  5.92    Male     No   Sat  Dinner     3    13.515
240       25.18  2.00  Female    Yes   Sat  Dinner     2    12.590
241       20.67  2.00    Male    Yes   Sat  Dinner     2    10.335
242       15.82  1.75    Male     No   Sat  Dinner     2     7.910
243       16.78  3.00  Female     No  Thur  Dinner     2     8.390

[244 rows x 8 columns]

In [12]: tips = tips.drop("new_bill", axis=1)

ここでは、セルごとに減算を行うように指示する必要がないことに注意してください。pandasがそれを処理してくれます。既存の列から派生した新しい列を作成する方法をご覧ください。

フィルタリング#

Excelでは、フィルタリングはグラフィカルメニューを通じて行われます。

Screenshot showing filtering of the total_bill column to values greater than 10

DataFrameは複数の方法でフィルタリングできます。最も直感的なのは、ブールインデックスを使用する方法です。

In [13]: tips[tips["total_bill"] > 10]
Out[13]: 
     total_bill   tip     sex smoker   day    time  size
0         14.99  1.01  Female     No   Sun  Dinner     2
2         19.01  3.50    Male     No   Sun  Dinner     3
3         21.68  3.31    Male     No   Sun  Dinner     2
4         22.59  3.61  Female     No   Sun  Dinner     4
5         23.29  4.71    Male     No   Sun  Dinner     4
..          ...   ...     ...    ...   ...     ...   ...
239       27.03  5.92    Male     No   Sat  Dinner     3
240       25.18  2.00  Female    Yes   Sat  Dinner     2
241       20.67  2.00    Male    Yes   Sat  Dinner     2
242       15.82  1.75    Male     No   Sat  Dinner     2
243       16.78  3.00  Female     No  Thur  Dinner     2

[204 rows x 7 columns]

上記のステートメントは、単にTrue/FalseオブジェクトのSeriesをDataFrameに渡しており、Trueのすべての行を返します。

In [14]: is_dinner = tips["time"] == "Dinner"

In [15]: is_dinner
Out[15]: 
0      True
1      True
2      True
3      True
4      True
       ... 
239    True
240    True
241    True
242    True
243    True
Name: time, Length: 244, dtype: bool

In [16]: is_dinner.value_counts()
Out[16]: 
time
True     176
False     68
Name: count, dtype: int64

In [17]: tips[is_dinner]
Out[17]: 
     total_bill   tip     sex smoker   day    time  size
0         14.99  1.01  Female     No   Sun  Dinner     2
1          8.34  1.66    Male     No   Sun  Dinner     3
2         19.01  3.50    Male     No   Sun  Dinner     3
3         21.68  3.31    Male     No   Sun  Dinner     2
4         22.59  3.61  Female     No   Sun  Dinner     4
..          ...   ...     ...    ...   ...     ...   ...
239       27.03  5.92    Male     No   Sat  Dinner     3
240       25.18  2.00  Female    Yes   Sat  Dinner     2
241       20.67  2.00    Male    Yes   Sat  Dinner     2
242       15.82  1.75    Male     No   Sat  Dinner     2
243       16.78  3.00  Female     No  Thur  Dinner     2

[176 rows x 7 columns]

If/thenロジック#

total_billが10ドル未満か以上かに基づいて、値がlowhighbucket列を作成するとしましょう。

スプレッドシートでは、論理比較は条件付き数式を使用して行うことができます。新しいbucket列のすべてのセルにドラッグして、=IF(A2 < 10, "low", "high")の数式を使用します。

Screenshot showing the formula from above in a bucket column of the tips spreadsheet

pandasでの同じ操作は、numpywhereメソッドを使用して実現できます。

In [18]: tips["bucket"] = np.where(tips["total_bill"] < 10, "low", "high")

In [19]: tips
Out[19]: 
     total_bill   tip     sex smoker   day    time  size bucket
0         14.99  1.01  Female     No   Sun  Dinner     2   high
1          8.34  1.66    Male     No   Sun  Dinner     3    low
2         19.01  3.50    Male     No   Sun  Dinner     3   high
3         21.68  3.31    Male     No   Sun  Dinner     2   high
4         22.59  3.61  Female     No   Sun  Dinner     4   high
..          ...   ...     ...    ...   ...     ...   ...    ...
239       27.03  5.92    Male     No   Sat  Dinner     3   high
240       25.18  2.00  Female    Yes   Sat  Dinner     2   high
241       20.67  2.00    Male    Yes   Sat  Dinner     2   high
242       15.82  1.75    Male     No   Sat  Dinner     2   high
243       16.78  3.00  Female     No  Thur  Dinner     2   high

[244 rows x 8 columns]

日付機能#

このセクションでは「日付」について言及しますが、タイムスタンプも同様に処理されます。

日付機能は、解析と出力の2つの部分で考えることができます。スプレッドシートでは、日付の値は通常自動的に解析されますが、必要な場合はDATEVALUE関数があります。pandasでは、プレーンテキストを明示的に日時オブジェクトに変換する必要があります。CSVから読み込む際、またはDataFrame内で変換します。

解析されると、スプレッドシートはデフォルトの形式で日付を表示しますが、形式を変更することができます。pandasでは、一般的に日付を計算に使用している間は、日付をdatetimeオブジェクトとして保持します。日付の部分(年など)を出力するには、スプレッドシートでは日付関数を、pandasではdatetimeプロパティを使用します。

スプレッドシートの列ABdate1date2がある場合、これらの数式を使用できます。

数式

date1_year

=YEAR(A2)

date2_month

=MONTH(B2)

date1_next

=DATE(YEAR(A2),MONTH(A2)+1,1)

months_between

=DATEDIF(A2,B2,"M")

同等のpandas操作を以下に示します。

In [20]: tips["date1"] = pd.Timestamp("2013-01-15")

In [21]: tips["date2"] = pd.Timestamp("2015-02-15")

In [22]: tips["date1_year"] = tips["date1"].dt.year

In [23]: tips["date2_month"] = tips["date2"].dt.month

In [24]: tips["date1_next"] = tips["date1"] + pd.offsets.MonthBegin()

In [25]: tips["months_between"] = tips["date2"].dt.to_period("M") - tips[
   ....:     "date1"
   ....: ].dt.to_period("M")
   ....: 

In [26]: tips[
   ....:     ["date1", "date2", "date1_year", "date2_month", "date1_next", "months_between"]
   ....: ]
   ....: 
Out[26]: 
         date1      date2  date1_year  date2_month date1_next    months_between
0   2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
1   2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
2   2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
3   2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
4   2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
..         ...        ...         ...          ...        ...               ...
239 2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
240 2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
241 2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
242 2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
243 2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>

[244 rows x 6 columns]

詳細については、時系列/日付機能を参照してください。

列の選択#

スプレッドシートでは、必要な列を次の方法で選択できます。

スプレッドシートの列は通常、ヘッダー行で名前が付けられるため、列の名前を変更するには、最初のセルのテキストを変更するだけです。

同じ操作が、以下のpandasで表現されています。

特定の列を保持する#

In [27]: tips[["sex", "total_bill", "tip"]]
Out[27]: 
        sex  total_bill   tip
0    Female       14.99  1.01
1      Male        8.34  1.66
2      Male       19.01  3.50
3      Male       21.68  3.31
4    Female       22.59  3.61
..      ...         ...   ...
239    Male       27.03  5.92
240  Female       25.18  2.00
241    Male       20.67  2.00
242    Male       15.82  1.75
243  Female       16.78  3.00

[244 rows x 3 columns]

列を削除する#

In [28]: tips.drop("sex", axis=1)
Out[28]: 
     total_bill   tip smoker   day    time  size
0         14.99  1.01     No   Sun  Dinner     2
1          8.34  1.66     No   Sun  Dinner     3
2         19.01  3.50     No   Sun  Dinner     3
3         21.68  3.31     No   Sun  Dinner     2
4         22.59  3.61     No   Sun  Dinner     4
..          ...   ...    ...   ...     ...   ...
239       27.03  5.92     No   Sat  Dinner     3
240       25.18  2.00    Yes   Sat  Dinner     2
241       20.67  2.00    Yes   Sat  Dinner     2
242       15.82  1.75     No   Sat  Dinner     2
243       16.78  3.00     No  Thur  Dinner     2

[244 rows x 6 columns]

列の名前を変更する#

In [29]: tips.rename(columns={"total_bill": "total_bill_2"})
Out[29]: 
     total_bill_2   tip     sex smoker   day    time  size
0           14.99  1.01  Female     No   Sun  Dinner     2
1            8.34  1.66    Male     No   Sun  Dinner     3
2           19.01  3.50    Male     No   Sun  Dinner     3
3           21.68  3.31    Male     No   Sun  Dinner     2
4           22.59  3.61  Female     No   Sun  Dinner     4
..            ...   ...     ...    ...   ...     ...   ...
239         27.03  5.92    Male     No   Sat  Dinner     3
240         25.18  2.00  Female    Yes   Sat  Dinner     2
241         20.67  2.00    Male    Yes   Sat  Dinner     2
242         15.82  1.75    Male     No   Sat  Dinner     2
243         16.78  3.00  Female     No  Thur  Dinner     2

[244 rows x 7 columns]

値によるソート#

スプレッドシートでのソートは、ソートダイアログを介して行われます。

Screenshot of dialog from Excel showing sorting by the sex then total_bill columns

pandasには、ソートする列のリストを受け取るDataFrame.sort_values()メソッドがあります。

In [30]: tips = tips.sort_values(["sex", "total_bill"])

In [31]: tips
Out[31]: 
     total_bill    tip     sex smoker   day    time  size
67         1.07   1.00  Female    Yes   Sat  Dinner     1
92         3.75   1.00  Female    Yes   Fri  Dinner     2
111        5.25   1.00  Female     No   Sat  Dinner     1
145        6.35   1.50  Female     No  Thur   Lunch     2
135        6.51   1.25  Female     No  Thur   Lunch     2
..          ...    ...     ...    ...   ...     ...   ...
182       43.35   3.50    Male    Yes   Sun  Dinner     3
156       46.17   5.00    Male     No   Sun  Dinner     6
59        46.27   6.73    Male     No   Sat  Dinner     4
212       46.33   9.00    Male     No   Sat  Dinner     4
170       48.81  10.00    Male    Yes   Sat  Dinner     3

[244 rows x 7 columns]

文字列処理#

文字列の長さの取得#

スプレッドシートでは、テキストの文字数はLEN関数で確認できます。これは、余分な空白を削除するためにTRIM関数とともに使用できます。

=LEN(TRIM(A2))

Series.str.len()で文字列の長さを確認できます。Python 3では、すべての文字列はUnicode文字列です。lenには末尾の空白が含まれます。末尾の空白を除外するには、lenrstripを使用します。

In [32]: tips["time"].str.len()
Out[32]: 
67     6
92     6
111    6
145    5
135    5
      ..
182    6
156    6
59     6
212    6
170    6
Name: time, Length: 244, dtype: int64

In [33]: tips["time"].str.rstrip().str.len()
Out[33]: 
67     6
92     6
111    6
145    5
135    5
      ..
182    6
156    6
59     6
212    6
170    6
Name: time, Length: 244, dtype: int64

これにより、文字列内の複数のスペースも含まれるため、100%同等ではありません。

部分文字列の位置の検索#

FINDスプレッドシート関数は、部分文字列の位置を返し、最初の文字は1です。

Screenshot of FIND formula being used in Excel

Series.str.find()メソッドを使用して、文字列の列内の文字の位置を検索できます。findは、部分文字列の最初の位置を検索します。部分文字列が見つかった場合、メソッドはその位置を返します。見つからない場合は、-1を返します。Pythonのインデックスはゼロベースであることに注意してください。

In [34]: tips["sex"].str.find("ale")
Out[34]: 
67     3
92     3
111    3
145    3
135    3
      ..
182    1
156    1
59     1
212    1
170    1
Name: sex, Length: 244, dtype: int64

位置による部分文字列の抽出#

スプレッドシートには、指定された位置から部分文字列を抽出するためのMID数式があります。最初の文字を取得するには

=MID(A2,1,1)

pandasでは、[]表記を使用して、位置によって文字列から部分文字列を抽出できます。Pythonのインデックスはゼロベースであることに注意してください。

In [35]: tips["sex"].str[0:1]
Out[35]: 
67     F
92     F
111    F
145    F
135    F
      ..
182    M
156    M
59     M
212    M
170    M
Name: sex, Length: 244, dtype: object

n番目の単語の抽出#

Excelでは、テキストを分割して特定の列を取得するために、テキストから列ウィザードへを使用できます。(数式で実行することも可能です。)

pandasで単語を抽出する最も簡単な方法は、スペースで文字列を分割し、インデックスで単語を参照することです。必要な場合は、より強力なアプローチがあることに注意してください。

In [36]: firstlast = pd.DataFrame({"String": ["John Smith", "Jane Cook"]})

In [37]: firstlast["First_Name"] = firstlast["String"].str.split(" ", expand=True)[0]

In [38]: firstlast["Last_Name"] = firstlast["String"].str.rsplit(" ", expand=True)[1]

In [39]: firstlast
Out[39]: 
       String First_Name Last_Name
0  John Smith       John     Smith
1   Jane Cook       Jane      Cook

大文字/小文字の変更#

スプレッドシートは、テキストをそれぞれ大文字、小文字、およびタイトルケースに変換するためのUPPER、LOWER、PROPER関数を提供します。

同等のpandasメソッドは、Series.str.upper()Series.str.lower()、およびSeries.str.title()です。

In [40]: firstlast = pd.DataFrame({"string": ["John Smith", "Jane Cook"]})

In [41]: firstlast["upper"] = firstlast["string"].str.upper()

In [42]: firstlast["lower"] = firstlast["string"].str.lower()

In [43]: firstlast["title"] = firstlast["string"].str.title()

In [44]: firstlast
Out[44]: 
       string       upper       lower       title
0  John Smith  JOHN SMITH  john smith  John Smith
1   Jane Cook   JANE COOK   jane cook   Jane Cook

マージ#

次のテーブルがマージの例で使用されます

In [45]: df1 = pd.DataFrame({"key": ["A", "B", "C", "D"], "value": np.random.randn(4)})

In [46]: df1
Out[46]: 
  key     value
0   A  0.469112
1   B -0.282863
2   C -1.509059
3   D -1.135632

In [47]: df2 = pd.DataFrame({"key": ["B", "D", "D", "E"], "value": np.random.randn(4)})

In [48]: df2
Out[48]: 
  key     value
0   B  1.212112
1   D -0.173215
2   D  0.119209
3   E -1.044236

Excelでは、テーブルのマージはVLOOKUPを介して行うことができます

Screenshot showing a VLOOKUP formula between two tables in Excel, with some values being filled in and others with "#N/A"

pandasのDataFrameには、同様の機能を提供するmerge()メソッドがあります。データは事前にソートする必要はなく、異なる結合タイプはhowキーワードを介して実現されます。

In [49]: inner_join = df1.merge(df2, on=["key"], how="inner")

In [50]: inner_join
Out[50]: 
  key   value_x   value_y
0   B -0.282863  1.212112
1   D -1.135632 -0.173215
2   D -1.135632  0.119209

In [51]: left_join = df1.merge(df2, on=["key"], how="left")

In [52]: left_join
Out[52]: 
  key   value_x   value_y
0   A  0.469112       NaN
1   B -0.282863  1.212112
2   C -1.509059       NaN
3   D -1.135632 -0.173215
4   D -1.135632  0.119209

In [53]: right_join = df1.merge(df2, on=["key"], how="right")

In [54]: right_join
Out[54]: 
  key   value_x   value_y
0   B -0.282863  1.212112
1   D -1.135632 -0.173215
2   D -1.135632  0.119209
3   E       NaN -1.044236

In [55]: outer_join = df1.merge(df2, on=["key"], how="outer")

In [56]: outer_join
Out[56]: 
  key   value_x   value_y
0   A  0.469112       NaN
1   B -0.282863  1.212112
2   C -1.509059       NaN
3   D -1.135632 -0.173215
4   D -1.135632  0.119209
5   E       NaN -1.044236

mergeには、VLOOKUPよりも多くの利点があります。

  • ルックアップ値は、ルックアップテーブルの最初の列である必要はありません

  • 複数の行が一致した場合、最初の一致だけでなく、一致ごとに1つの行になります

  • 指定された単一の列だけでなく、ルックアップテーブルのすべての列が含まれます

  • より複雑な結合操作をサポートします

その他の考慮事項#

フィルハンドル#

特定のセルで設定されたパターンに従って一連の数値を作成します。スプレッドシートでは、これは最初の数値を入力した後でShiftキーを押しながらドラッグするか、最初の2つまたは3つの値を入力してからドラッグすることによって行われます。

これは、シリーズを作成し、それを目的のセルに割り当てることで実現できます。

In [57]: df = pd.DataFrame({"AAA": [1] * 8, "BBB": list(range(0, 8))})

In [58]: df
Out[58]: 
   AAA  BBB
0    1    0
1    1    1
2    1    2
3    1    3
4    1    4
5    1    5
6    1    6
7    1    7

In [59]: series = list(range(1, 5))

In [60]: series
Out[60]: [1, 2, 3, 4]

In [61]: df.loc[2:5, "AAA"] = series

In [62]: df
Out[62]: 
   AAA  BBB
0    1    0
1    1    1
2    1    2
3    2    3
4    3    4
5    4    5
6    1    6
7    1    7

重複を削除#

Excelには、重複値を削除するための組み込み機能があります。これはpandasでは、drop_duplicates() を使用してサポートされています。

In [63]: df = pd.DataFrame(
   ....:     {
   ....:         "class": ["A", "A", "A", "B", "C", "D"],
   ....:         "student_count": [42, 35, 42, 50, 47, 45],
   ....:         "all_pass": ["Yes", "Yes", "Yes", "No", "No", "Yes"],
   ....:     }
   ....: )
   ....: 

In [64]: df.drop_duplicates()
Out[64]: 
  class  student_count all_pass
0     A             42      Yes
1     A             35      Yes
3     B             50       No
4     C             47       No
5     D             45      Yes

In [65]: df.drop_duplicates(["class", "student_count"])
Out[65]: 
  class  student_count all_pass
0     A             42      Yes
1     A             35      Yes
3     B             50       No
4     C             47       No
5     D             45      Yes

ピボットテーブル#

スプレッドシートのピボットテーブルは、pandasではReshaping and pivot tables を通じて再現できます。再度 tips データセットを使用して、パーティーの規模とサーバーの性別ごとの平均チップを見つけましょう。

Excelでは、ピボットテーブルに次の構成を使用します。

Screenshot showing a PivotTable in Excel, using sex as the column, size as the rows, then average tip as the values

pandasでの同等の操作

In [66]: pd.pivot_table(
   ....:     tips, values="tip", index=["size"], columns=["sex"], aggfunc=np.average
   ....: )
   ....: 
Out[66]: 
sex     Female      Male
size                    
1     1.276667  1.920000
2     2.528448  2.614184
3     3.250000  3.476667
4     4.021111  4.172143
5     5.140000  3.750000
6     4.600000  5.850000

行の追加#

RangeIndex (番号付けされた 0, 1, etc.) を使用していると仮定すると、concat() を使用して DataFrame の一番下に行を追加できます。

In [67]: df
Out[67]: 
  class  student_count all_pass
0     A             42      Yes
1     A             35      Yes
2     A             42      Yes
3     B             50       No
4     C             47       No
5     D             45      Yes

In [68]: new_row = pd.DataFrame([["E", 51, True]],
   ....:                        columns=["class", "student_count", "all_pass"])
   ....: 

In [69]: pd.concat([df, new_row])
Out[69]: 
  class  student_count all_pass
0     A             42      Yes
1     A             35      Yes
2     A             42      Yes
3     B             50       No
4     C             47       No
5     D             45      Yes
0     E             51     True

検索と置換#

Excelの検索ダイアログでは、一致するセルが1つずつ表示されます。pandasでは、この操作は通常、条件式 を介して、列全体または DataFrame 全体に対して一度に行われます。

In [70]: tips
Out[70]: 
     total_bill    tip     sex smoker   day    time  size
67         1.07   1.00  Female    Yes   Sat  Dinner     1
92         3.75   1.00  Female    Yes   Fri  Dinner     2
111        5.25   1.00  Female     No   Sat  Dinner     1
145        6.35   1.50  Female     No  Thur   Lunch     2
135        6.51   1.25  Female     No  Thur   Lunch     2
..          ...    ...     ...    ...   ...     ...   ...
182       43.35   3.50    Male    Yes   Sun  Dinner     3
156       46.17   5.00    Male     No   Sun  Dinner     6
59        46.27   6.73    Male     No   Sat  Dinner     4
212       46.33   9.00    Male     No   Sat  Dinner     4
170       48.81  10.00    Male    Yes   Sat  Dinner     3

[244 rows x 7 columns]

In [71]: tips == "Sun"
Out[71]: 
     total_bill    tip    sex  smoker    day   time   size
67        False  False  False   False  False  False  False
92        False  False  False   False  False  False  False
111       False  False  False   False  False  False  False
145       False  False  False   False  False  False  False
135       False  False  False   False  False  False  False
..          ...    ...    ...     ...    ...    ...    ...
182       False  False  False   False   True  False  False
156       False  False  False   False   True  False  False
59        False  False  False   False  False  False  False
212       False  False  False   False  False  False  False
170       False  False  False   False  False  False  False

[244 rows x 7 columns]

In [72]: tips["day"].str.contains("S")
Out[72]: 
67      True
92     False
111     True
145    False
135    False
       ...  
182     True
156     True
59      True
212     True
170     True
Name: day, Length: 244, dtype: bool

pandasの replace() は、Excelの すべて置換 に相当します。

In [73]: tips.replace("Thu", "Thursday")
Out[73]: 
     total_bill    tip     sex smoker   day    time  size
67         1.07   1.00  Female    Yes   Sat  Dinner     1
92         3.75   1.00  Female    Yes   Fri  Dinner     2
111        5.25   1.00  Female     No   Sat  Dinner     1
145        6.35   1.50  Female     No  Thur   Lunch     2
135        6.51   1.25  Female     No  Thur   Lunch     2
..          ...    ...     ...    ...   ...     ...   ...
182       43.35   3.50    Male    Yes   Sun  Dinner     3
156       46.17   5.00    Male     No   Sun  Dinner     6
59        46.27   6.73    Male     No   Sat  Dinner     4
212       46.33   9.00    Male     No   Sat  Dinner     4
170       48.81  10.00    Male    Yes   Sat  Dinner     3

[244 rows x 7 columns]