LoginSignup
0
0

More than 1 year has passed since last update.

Pandasの使い方3

Last updated at Posted at 2021-03-06

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)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0