Pandasの使い方3

#1 この記事は

DataFrame型データの各種操作方法をメモする。


| 題名 | リンク | 
|:-----------|------------:|
| 【python】Pandasの使い方 |     [LINK](https://qiita.com/NT1123/items/ab1c6dc582684d7d7436) | 
| 【python】Pandas2の使い方 |     [LINK](https://qiita.com/NT1123/items/24e6b848761f83514720) | 
| 【python】Pandas3の使い方 |     [LINK](https://qiita.com/NT1123/items/4bd0fa8cc8254b3b651d) | 
| 【python】Pandas4の使い方 |     [LINK](https://qiita.com/NT1123/items/6e6bcc880aae6f0940ed) | 
| 【python】Pandas5の使い方 |     [LINK](https://qiita.com/NT1123/items/376d3d6eec559a3cd78e) | 
| 【python】Pandas ,pythonコードメモ 6 |     [LINK](https://qiita.com/NT1123/items/d2357e803057699a9a9c) |

#2 内容

###2-1 DataFrame型の各列に関数を作用させてデータを生成する。


DataFrame型dfの列C > 8 かつ 列D<90のとき、D1列に1を書き込む作業を行う。

```python: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)

```
実行結果

```console
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型に変換する。

```python: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)


```
実行結果

```console
               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の値を抽出する。

```python: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
```
実行結果

```console
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に変換する

https://qiita.com/exp/items/2253e32c22e81e688ef4

###2-5 列を入れ替える

```python: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
```
実行結果

```console

          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できるようにする。

```python: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")

```
実行結果

```console


```



###2-7　文字列型日付を日付型に列ごと変更する

```python: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

```
実行結果

```console
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　２つのdataframeを和結合する。(重複行は削除する) & 積結合する。

```python: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)


```
実行結果

```console
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型に変換する

```python: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


```
実行結果

```console
   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日足し算する

```python: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


```
実行結果

```console
datetime.datetime(2021, 4, 2, 0, 0)

```