pandas

since 2021-10-19

concat

https://pandas.pydata.org/docs/reference/api/pandas.concat.html

df を縦に結合

df1 = pd.read_csv(...)
df2 = pd.read_csv(...)
pd.concat([df1, df2])

value_counts

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.value_counts.html

「どの値がいくつあるか」を Series で返す

json_normalize

dict or list of dicts を受け取って DataFrame を作る。

https://pandas.pydata.org/pandas-docs/version/1.2.0/reference/api/pandas.json_normalize.html

DynamoDB から PartiQL でデータを取り出して DataFrame を作りたい。

下記の AWS_ACCESS_KEY_ID の IAM には "dynamodb:PartiQLSelect" 権限が必要。

import boto3
import pandas as pd
dynamodb = boto3.client("dynamodb", region_name=AWS_REGION_NAME, aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
result = dynamodb.execute_statement(Statement="""
SELECT * FROM "テーブル名" where "ハッシュキー名" = 値 and "レンジキー名" between 'レンジキー範囲1' and 'レンジキー範囲2'
""")
data = result["Items"]
df = pd.json_normalize(data)
df.head()

例えば 'created_at': {'S': '2021-10-17T04:00:47.258208+0000'} みたいな値があると created_at.S という列ができる。

.S などのない列名に付け替える:

column_map = {name: name.split(".")[0] for name in df.columns}
df.rename(columns=column_map, inplace=True)

set_index / reset_index

df.set_index("列名") するとその列がインデックスになる。

df.reset_index() するとインデックスが通し番号になって、インデックスだった列は通常のデータの列になる。drop=True を付けると元のインデックスを削除。

いずれも inplace=True しないと、新しい df を返す。

df.reset_index().to_json(orient="records", lines=True) みたいにすると、素直な「各行がJSONのファイル」を得られる。

reindex

列の並び順を変える。

df の一番右の列を一番左に移す:

columns = list(df.columns)
columns = [columns[-1]] + columns[:-1]
df = df.reindex(columns=columns)

drop

df の列を削除するには axis=1 を指定する

df.drop(["列名1", "列名2"], axis=1, inplace=True)

melt

since 2021-11-09

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.melt.html

横持ちから縦持ちに。

こうすると plotly で2色の折れ線グラフが作れる。

>>> df.to_csv()

,Date,temperature,humidity
18303,2021-10-25 08:41:00,20.6,53
18304,2021-10-25 09:11:00,20.7,53
18305,2021-10-25 09:41:00,20.7,52
18306,2021-10-25 09:11:00,20.7,53
18307,2021-10-25 09:41:00,20.7,52

>>> df2 = pd.melt(df, id_vars="Date").set_index("Date")

>>> df2.to_csv()

Date,variable,value
2021-10-25 08:41:00,temperature,20.6
2021-10-25 09:11:00,temperature,20.7
2021-10-25 09:41:00,temperature,20.7
2021-10-25 09:11:00,temperature,20.7
2021-10-25 09:41:00,temperature,20.7
2021-10-25 08:41:00,humidity,53.0
2021-10-25 09:11:00,humidity,53.0
2021-10-25 09:41:00,humidity,52.0
2021-10-25 09:11:00,humidity,53.0
2021-10-25 09:41:00,humidity,52.0

>>> import plotly.express as px
>>> px.line(df2, x=df2.index, y="value", color="variable")

read_json

since 2021-11-30

https://ggcs.io/2020/05/26/pandas-json/

https://note.nkmk.me/python-pandas-read-json/

orientオプション

  • 'split' : dict like {index → [index], columns → [columns], data → [values]}
  • 'records' : list like [{column → value}, … , {column → value}]
  • 'index' : dict like {index → {column → value}}
  • 'columns' : dict like {column → {index → value}}
  • 'values' : just the values array

sort_values

loc / iloc

df.loc[]

df.iloc[]

groupby + agg

https://pandas.pydata.org/pandas-docs/version/0.23/generated/pandas.core.groupby.DataFrameGroupBy.agg.html

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.agg.html

agg() に渡せるもの

  • sum などの関数オブジェクト
  • "sum" などの関数名
  • 関数オブジェクトや関数名のリスト
  • 行や列の名前と関数を対応づけた dict

merge

since 2022-01-10

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.merge.html

  • on を省略すると2つの DataFrame の列の共通項目が自動的に選ばれる、とされている
  • df1 の列が A, B, C, D で df2 の列が A, B, X, Y だと、df.merge(df1, df2) だけで on=['A', 'B'] になる
pandas.txt · 最終更新: 2022/01/10 17:22 by Takuya Nishimoto
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0