#1 この記事は
DataFrame型データの各種操作方法をメモする。
題名 | リンク |
---|---|
【python】Pandasの使い方 | LINK |
【python】Pandas2の使い方 | LINK |
【python】Pandas3の使い方 | LINK |
【python】Pandas4の使い方 | LINK |
【python】Pandas5の使い方 | LINK |
【python】Pandas ,pythonコードメモ 6 | LINK |
#2 内容
###2-1 DataFrame型の各列に関数を作用させてデータを生成する。
DataFrame型dfの列C > 8 かつ 列D<90のとき、D1列に1を書き込む作業を行う。
sample.py
import pandas as pd
import numpy as np
import scipy.stats
#関数定義 DataFrame型xの列C > 8 かつ 列D<90のとき、D1列に1を書き込む
def judge(x):
x.loc[ ( (x['C'] > 8 ) & (x['D']<90) ) , 'D1'] = 1
return x['D1']
#dataを定義する。
dat = [
[100,'2019-07-01',2,7,0,0],
[100,'2019-07-02',4,77,0,0],
[100,'2019-07-03',8,8,0,0],
[100,'2019-07-04',16,89,0,0],
[200,'2020-07-06',100,9,0,0],
[200,'2019-07-05',200,99,0,0],
[200,'2019-07-04',400,123,0,0],
[200,'2019-07-03',200,345,0,0],
]
#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B","C","D","D1","D2"])
#A,B列をindexに指定する。
df=df.set_index(["A","B"])
#DataFrame dfをindex Aでgroupbyさせる。df.groupby("A")に関数judgeを作用させる。judgeはseries型で返却されるので、to_frameでDataFrame型に変換し、dfのD1列に書き込む。
df['D1']= df.groupby("A").apply(lambda x:judge(x).to_frame('any'))
print("df",df)
実行結果
df C D D1 D2
A B
100 2019-07-01 2 7 0 0
2019-07-02 4 77 0 0
2019-07-03 8 8 0 0
2019-07-04 16 89 1 0
200 2020-07-06 100 9 1 0
2019-07-05 200 99 0 0
2019-07-04 400 123 0 0
2019-07-03 200 345 0 0
###2-2 Array型-> DataFrame型に変換する。
sample.py
import pandas as pd
import numpy as np
dat = [
['2019-07-01','9997','740'],
['2019-07-02','9997','749'],
['2019-07-03','9997','757'],
['2019-07-04','9997','769'],
['2019-07-05','9997','762'],
['2019-07-08','9997','760']
]
df4 = pd.DataFrame(dat,columns=["A","B","C"])
#列Aをindexに指定する。
df4.set_index("A",inplace=True)
#データフレームを作る。
df4 = pd.DataFrame(dat,columns=["A","B","C"])
print(df4)
#列名"A"をindexに指定している。
df4.set_index("A",inplace=True)
print(df4)
#列名"A"のindexを解除する
df4.reset_index("A",inplace=True)
print("列名Aをindexを解除する")
print(df4)
実行結果
B C
A
2019-07-01 9997 740
2019-07-02 9997 749
2019-07-03 9997 757
2019-07-04 9997 769
2019-07-05 9997 762
2019-07-08 9997 760
列名Aのindexを解除する
A B C
0 2019-07-01 9997 740
1 2019-07-02 9997 749
2 2019-07-03 9997 757
3 2019-07-04 9997 769
4 2019-07-05 9997 762
5 2019-07-08 9997 760
###2-3 DataFrame型からindexの値を抽出する。
sample.py
import pandas as pd
import numpy as np
import scipy.stats
#dataを定義する。
dat = [
[100,'2019-07-01',2,7,0,0],
[100,'2019-07-02',4,77,0,0],
[100,'2019-07-03',8,8,0,0],
[100,'2019-07-04',16,89,0,0],
[200,'2020-07-06',100,9,0,0],
[200,'2019-07-05',200,99,0,0],
[200,'2019-07-04',400,123,0,0],
[200,'2019-07-03',200,345,0,0],
]
#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B","C","D","D1","D2"])
df.index.values
実行結果
array([(100, '2019-07-01'), (100, '2019-07-02'), (100, '2019-07-03'),
(100, '2019-07-04'), (200, '2020-07-06'), (200, '2019-07-05'),
(200, '2019-07-04'), (200, '2019-07-03')], dtype=object)
###2-4 numpyのint64をpythonのintに変換する
###2-5 列を入れ替える
sample.py
import pandas as pd
import numpy as np
#dataを定義する
dat = [
[100,'2019-07-01'],
[100,'2019-07-02'],
[100,'2019-07-03'],
[100,'2019-07-04'],
[200,'2020-07-06'],
[200,'2019-07-05'],
[200,'2019-07-04'],
[200,'2019-07-03'],
]
#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B"])
#列Aと列Bを入れ替える。
df =df.reindex(columns=['B','A'])
df
実行結果
B A
0 2019-07-01 100
1 2019-07-02 100
2 2019-07-03 100
3 2019-07-04 100
4 2020-07-06 200
5 2019-07-05 200
6 2019-07-04 200
7 2019-07-03 200
###2-6 オブジェクトを保存、読み出しをする。
オブジェクトを出力するのに長い時間がかかるとき、計算結果をあらかじめlocalに保存しておき、
次回jyupterを立ち上げたときにすぐにloadできるようにする。
sample.py
import pickle
def dumpPickle(fileName, obj):
with open(fileName, mode="wb") as f:
pickle.dump(obj, f)
dumpPickle("lst.pickle", [1,2,3,4,5])
dumpPickle("str.pickle", "helooooooo!!")
dumpPickle("int.pickle", 11114)
def loadPickle(fileName):
with open(fileName, mode="rb") as f:
return pickle.load(f)
lst = loadPickle("lst.pickle")
_str = loadPickle("str.pickle")
_int = loadPickle("int.pickle")
実行結果
###2-7 文字列型日付を日付型に列ごと変更する
sample.py
import pandas as pd
import numpy as np
dat = [
['21/04/08','9997','740'],
['21/04/07','9997','749'],
['21/04/06','9997','757'],
]
df4 = pd.DataFrame(dat,columns=["A","B","C"])
df4['AA'] = "20"+df4['A']
df4['AA'] = pd.to_datetime(df4['AA'], format='%Y/%m/%d') #文字列型を日付型に変更する
df4
実行結果
A B C AA
0 21/04/08 9997 740 2021-04-08
1 21/04/07 9997 749 2021-04-07
2 21/04/06 9997 757 2021-04-06
###2-8 2つのdataframeを和結合する。(重複行は削除する) & 積結合する。
sample.py
import pandas as pd
dat0 = [
['2019-07-01','9997','740'],
['2019-07-02','9997','749'],
['2019-07-03','9997','757'],
]
dat1 = [
['2019-07-03','9997','769'],
['2019-07-04','1','2'],
['2019-07-05','3','4']
]
df0 = pd.DataFrame(dat0,columns=["A","B","C"])
df1 = pd.DataFrame(dat1,columns=["A","B","C"])
#A,B列をindexに指定する。
df0=df0.set_index(["A"])
df1=df1.set_index(["A"])
dfc=pd.concat([df0, df1], join='outer') #df0とdf1を結合する。outerは和結合を意味する。
dfc1=dfc.groupby(level=0).last() #重複INDEX行は削除する。
print("df0")
display(df0)
print("df1")
display(df1)
print("dfc1")
display(dfc1)
#共通するindexのみの行を残す
dfc=pd.concat([df0, df1], axis=1, join='inner') #df0とdf1を結合する。innerは共通するindexのみの行を残す
#dfc1=dfc.groupby(level=0).last() #重複INDEX行は削除する。
print("df0")
display(df0)
print("df1")
display(df1)
print("dfc")
display(dfc)
実行結果
df0
B C
A
2019-07-01 9997 740
2019-07-02 9997 749
2019-07-03 9997 757
df1
B C
A
2019-07-03 9997 769
2019-07-04 1 2
2019-07-05 3 4
dfc1
B C
A
2019-07-01 9997 740
2019-07-02 9997 749
2019-07-03 9997 769
2019-07-04 1 2
2019-07-05 3 4
#共通するindexのみを残す
df0
B C
A
2019-07-01 9997 740
2019-07-02 9997 749
2019-07-03 9997 757
df1
B C
A
2019-07-03 9997 769
2019-07-04 1 2
2019-07-05 3 4
dfc
B C B C
A
2019-07-03 9997 757 9997 769
###2-9 List型をDataFrame型に変換する
sample.py
l_2d = [[0, 1, 2], [3, 4, 5]]
df = pd.DataFrame(l_2d)
print(df)
# 0 1 2
# 0 0 1 2
# 1 3 4 5
df = pd.DataFrame(l_2d,
index=['row1', 'row2'],
columns=['col1', 'col2', 'col3'])
print(df)
# col1 col2 col3
# row1 0 1 2
# row2 3 4 5
実行結果
0 1 2
0 0 1 2
1 3 4 5
col1 col2 col3
row1 0 1 2
row2 3 4 5
###2-10 日付に1日足し算する
sample.py
start= "2021-04-1"
end= "2021-04-20"
day=datetime.datetime.strptime(start, '%Y-%m-%d') #文字型を日付型に変換する
day1=day+datetime.timedelta(days=1)
day1
実行結果
datetime.datetime(2021, 4, 2, 0, 0)