スプレッドシートとの比較#
pandasの潜在的なユーザーの多くはExcelのようなスプレッドシートプログラムに多少の馴染みがあるため、このページではpandasを使用してさまざまなスプレッドシート操作をどのように実行するかについていくつかの例を提供することを目的としています。このページではExcelの用語を使用し、Excelのドキュメントへのリンクを提供しますが、Google スプレッドシート、LibreOffice Calc、Apple Numbers、その他のExcel互換のスプレッドシートソフトウェアでも同じか類似している部分が多くあります。
pandasを初めて使用する場合は、まずpandasの10分間を読んで、ライブラリに慣れておくことをお勧めします。
慣例通り、pandasとNumPyを次のようにインポートします。
In [1]: import pandas as pd
In [2]: import numpy as np
データ構造#
一般的な用語の対応#
pandas |
Excel |
---|---|
|
ワークシート |
|
列 |
|
行見出し |
行 |
行 |
|
空のセル |
DataFrame
#
pandasのDataFrame
は、Excelのワークシートに似ています。Excelのワークブックには複数のワークシートを含めることができますが、pandasのDataFrame
は独立して存在します。
Series
#
Series
は、DataFrame
の1つの列を表すデータ構造です。Series
を操作することは、スプレッドシートの列を参照することに似ています。
Index
#
すべてのDataFrame
とSeries
には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
)でinplace
とcopy
を非推奨化して削除することについて活発な議論があります。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
外部データの読み込み#
Excelとpandasの両方で、さまざまな形式でさまざまなソースからデータをインポートできます。
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では、フィルタリングはグラフィカルメニューを通じて行われます。

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ドル未満か以上かに基づいて、値がlow
とhigh
のbucket
列を作成するとしましょう。
スプレッドシートでは、論理比較は条件付き数式を使用して行うことができます。新しいbucket
列のすべてのセルにドラッグして、=IF(A2 < 10, "low", "high")
の数式を使用します。

pandasでの同じ操作は、numpy
のwhere
メソッドを使用して実現できます。
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プロパティを使用します。
スプレッドシートの列A
とB
にdate1
とdate2
がある場合、これらの数式を使用できます。
列 |
数式 |
---|---|
|
|
|
|
|
|
|
|
同等の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]
値によるソート#
スプレッドシートでのソートは、ソートダイアログを介して行われます。

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
には末尾の空白が含まれます。末尾の空白を除外するには、len
とrstrip
を使用します。
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
です。

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を介して行うことができます。

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では、ピボットテーブルに次の構成を使用します。

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]