Pandas-03 (文字列とテキスト データ、インデックスとデータの選択、統計関数、ウィンドウ関数)

目次

1. 文字列およびテキストデータ

2. データのインデックス作成と選択

2.1 .loc() はラベルによって選択します

2.2 .iloc() は位置によって選択します

2.3 属性を使用してデータを取得する

3. 統計関数

3.1 パーセント変化.pct_change()

3.2 共分散.cov()

3.3 相関.corr()

3.4 データランキング.rank()

4. ウィンドウ関数


1. 文字列およびテキストデータ

シリーズは、配列内の各要素を簡単に操作できる文字列処理メソッドをサポートしています。これらのメソッドは、欠損値や null 値を自動的に除外します。これがおそらく最も重要な機能です。これらのメソッドは str Series の属性を介してアクセスされます。通常、これらの操作の名前は、. lower();.upper();.len() などの組み込みの文字列メソッドやその他の基本メソッドと一致します。

例:

import pandas as pd
import numpy as np

s = pd.Series([' Tom ',' xiaoming ',' john '])
s

#删除空格
s.str.strip()

#字符串分割
s.str.split('o')

#字符串拼接
s.str.cat(sep="<=>")

#辨别分类
s.str.get_dummies()

#字符串包含的内容
s.str.contains('m')

#字符串替换
s.str.replace('o',"dd")

#计数
s.str.count('i')

#对一系列字符串判断是否是数字
s = pd.Series([' Tom ','778899',' xiaoming ',' john '])
s.str.isnumeric()

出力結果:

# 原始Series
0          Tom 
1     xiaoming 
2         john 
dtype: object

# 删除空格
0         Tom
1    xiaoming
2        john
dtype: object

# 字符串以o进行分割
0         [ T, m ]
1    [ xia, ming ]
2        [ j, hn ]
dtype: object

# 字符串拼接
' Tom <=> xiaoming <=> john '

# 辨别分类
	Tom	john xiaoming
0	1	 0	   0
1	0	 0	   1
2	0	 1	   0

# 字符串包含的内容
0     True
1     True
2    False
dtype: bool

# 字符串替换
0          Tddm 
1     xiaddming 
2         jddhn 
dtype: object

# 计数(字符串中i的数量)
0    0
1    2
2    0
dtype: int64

# 对一系列字符串判断是否是数字
0    False
1     True
2    False
3    False
dtype: bool

2. データのインデックス作成と選択

pandas では、インデックス添字または列名インデックスの使用に加えて、データのインデックス付けに .loc();.iloc() を使用することもできます。

2.1 .loc() はラベルによって選択します

pandas は、純粋なラベルベースのインデックス作成を実現する一連のメソッドを提供しますこれは厳格な包括ベースの契約です。リクエストされたすべてのタグはインデックスに存在する必要があり、そうでない場合はKeyErrorインデックスが生成されます。スライスするときは、インデックスに開始境界と終了境界が存在する場合はそれを含めます整数は有効なラベルですが、位置ではなくラベルを参照します

この.locプロパティは主なアクセス方法です。有効なエントリは次のとおりです。

  • 5または などの単一のラベル'a'(インデックスのラベル5として解釈されることに注意してください。この使用法はインデックスに沿った整数の位置ではありません)。

  • ラベルのリストまたは配列。['a', 'b', 'c']

  • ラベル付きスライス オブジェクト'a':'f'(通常の Python スライスとは異なり、開始と終了がインデックスに含まれることに注意してください。 「ラベル付きスライス」を参照してください)。

  • ブール配列。

  • callable「呼び出し可能による選択」を参照してください。

例: 操作用に 8 行の破れたデータをランダムに生成する

import pandas as pd
import numpy as np


df = pd.DataFrame(np.random.randn(8,4),index=['a','b','c','d','e','f','g','h'],columns=["A","B","C","D"])
df

#  输出结果
	A	            B	        C	       D
a	0.529671	-0.076485	0.379469	1.494926
b	-0.082312	-0.328869	0.175183	-0.798430
c	0.681922	0.741320	-0.910726	-2.176608
d	1.500632	-1.165229	0.316722	0.402977
e	-2.044217	0.930242	0.433050	0.542472
f	1.332038	0.476599	1.661994	2.102483
g	0.488362	-1.667154	-0.651079	-0.049332
h	-0.676308	0.904894	1.592176	0.409881

1. 列 AB の内容をすべて選択します (スライスを使用)

#选择A.B列所有的内容,基于标签
df.loc[:,['A','B']]

#输出结果
        A	        B
a	0.529671	-0.076485
b	-0.082312	-0.328869
c	0.681922	0.741320
d	1.500632	-1.165229
e	-2.044217	0.930242
f	1.332038	0.476599
g	0.488362	-1.667154
h	-0.676308	0.904894

2. ae行、b以降の列(スライス)を選択します。

#选择a-e行,b以后的列
df.loc['a':'e','B':]


# 输出结果:
        B	        C	        D
a	-0.076485	0.379469	1.494926
b	-0.328869	0.175183	-0.798430
c	0.741320	-0.910726	-2.176608
d	-1.165229	0.316722	0.402977
e	0.930242	0.433050	0.542472

3. aタグ内の1より大きいデータを取り出す

# 取出a标签里大于一的数据
df.loc['a']>1

# 输出结果
A    False
B    False
C    False
D     True
Name: a, dtype: bool

4. a が 1 より大きい列の内容を取り出します。

# 取出a大于1的那一列内容
df.loc[:,df.loc['a']>1]


#输出结果:
        D
a	1.494926
b	-0.798430
c	-2.176608
d	0.402977
e	0.542472
f	2.102483
g	-0.049332
h	0.409881

2.2 .iloc() は位置によって選択します

pandas は、純粋に整数ベースのインデックスを取得するための一連のメソッドを提供しますセマンティクスは Python と NumPy スライスに厳密に従っています。これらはインデックスです0-basedスライスする場合、開始境界は含まれますが、上限は除外されます有効なラベルであっても整数以外を使用しようとすると、が発生しますIndexError

この.ilocプロパティは主なアクセス方法です。有効なエントリは次のとおりです。

  • 整数、例: 5

  • 整数のリストまたは配列。[4, 3, 0]

  • ints を持つスライス オブジェクト1:7

  • ブール配列。

  • callable「呼び出し可能による選択」を参照してください。

例: 上記の場合のデータフレーム

        A	        B	       C	       D
a	0.529671	-0.076485	0.379469	1.494926
b	-0.082312	-0.328869	0.175183	-0.798430
c	0.681922	0.741320	-0.910726	-2.176608
d	1.500632	-1.165229	0.316722	0.402977
e	-2.044217	0.930242	0.433050	0.542472
f	1.332038	0.476599	1.661994	2.102483
g	0.488362	-1.667154	-0.651079	-0.049332
h	-0.676308	0.904894	1.592176	0.409881

1. (行) 位置に基づくインデックス

# 基于(行)位置的索引
df.iloc[0]


#输出结果:
A    0.529671
B   -0.076485
C    0.379469
D    1.494926
Name: a, dtype: float64


df.iloc[1]

#输出结果:
A   -0.082312
B   -0.328869
C    0.175183
D   -0.798430
Name: b, dtype: float64

2. 3行目2列目以降の内容を取り出す

df.iloc[3:,1:]


#输出结果:
        B	        C	       D
d	-1.165229	0.316722	0.402977
e	0.930242	0.433050	0.542472
f	0.476599	1.661994	2.102483
g	-1.667154	-0.651079	-0.049332
h	0.904894	1.592176	0.409881

2.3 属性を使用してデータを取得する

上記のデータはpandasでは属性取得でもデータを取得することができます。

例:A列とD列のデータを取り出す

#属性获取,取出A列内容
df.A

#输出结果:
a    1.310455
b   -1.015628
c    1.281924
d    0.496812
e   -1.733183
f    0.140338
g   -0.179063
h   -0.642013
Name: A, dtype: float64



df.D

#输出结果:
a   -0.298131
b   -1.141310
c   -0.302760
d    1.188531
e   -1.608952
f    0.437460
g   -0.696010
h   -0.525048
Name: D, dtype: float64

3. 統計関数

Pandas は、パーセント変更.pct_change()、共分散.cov()、相関.corr()、データランキング.ランク()メソッドなど、ユーザーが使用できるさまざまな統計関数を提供します。

3.1 パーセント変化.pct_change()

Seriesそして、指定された期間数の変化率を計算するDataFrameメソッド.pct_change()があります (変化率を計算する前に、fill_method NA/null 値でパディングを使用します)。

基本的な構文:

Series.pct_change()
or
DataFrame.pct_change(periods=行数)

例:

import pandas as pd
import numpy as np

#创建基础Series
s = pd.Series([877,865,874,890,912])
s

# 输出结果:
0    877
1    865
2    874
3    890
4    912
dtype: int64


#创建基础dataframe
df = pd.DataFrame(np.random.randn(5, 4))
df

#输出结果
        0	         1	        2	       3
0	0.655875	-2.195588	-0.785019	1.122582
1	0.852057	-2.276063	1.528201	-0.167119
2	-1.057979	-0.396548	-0.915528	0.026226
3	-0.490155	1.803235	0.005851	-1.252117
4	0.946558	-2.680471	-0.055739	-0.624553

変化の割合を取得します。

# 变化的百分比程度(波动变化)
s.pct_change()


#输出结果:
0         NaN
1   -0.013683
2    0.010405
3    0.018307
4    0.024719
dtype: float64



# 变化的百分比程度
df.pct_change(periods=1)


# 输出结果:

        0	        1	         2	         3
0	     NaN	     NaN	     NaN	     NaN
1	0.299115	0.036653	-2.946706	-1.148870
2	-2.241677	-0.825775	-1.599088	-1.156933
3	-0.536707	-5.547331	-1.006391	-48.742482
4	-2.931143	-2.486479	-10.526903	-0.501202

3.2 共分散.cov()

Series.cov() を使用すると、系列間の共分散 (欠損値を除く) を計算できます。

DataFrame.cov() は、 DataFrame 内の系列間のペアごとの共分散を計算します (NA/null 値も除外します)。

例:

#计算两个Series之间的协方差
s1 = pd.Series(np.random.randn(10))
s2 = pd.Series(np.random.randn(10))


#两个数据的协方差
s1.cov(s2)


#输出结果:
-0.0751790891671201



# 计算dataframe中数据的协方差
frame = pd.DataFrame(np.random.randn(1000, 5), columns=["a", "b", "c", "d", "e"])


frame.cov()

#输出结果:
       a         b         c         d         e
a  1.000882 -0.003177 -0.002698 -0.006889  0.031912
b -0.003177  1.024721  0.000191  0.009212  0.000857
c -0.002698  0.000191  0.950735 -0.031743 -0.005087
d -0.006889  0.009212 -0.031743  1.002983 -0.047952
e  0.031912  0.000857 -0.005087 -0.047952  1.042487

 DataFrame.covmin_periods有効な結果を得るために各列ペアに必要な観測値の最小数を指定するオプションのキーワードもサポートされています。例えば

フレーム.cov(min_periods=12)

データフレーム内のデータが少なくとも 12 列あることを確認し、12 列が足りない場合は NaN を返します。

3.3 相関.corr()

相関関係は .coor() メソッドを使用して計算できます。このmethodパラメーターを使用して、相関関係を計算するいくつかの方法が提供されます。

メソッド名

説明する

pearson (default)

標準相関係数

kendall

ケンダル・タウの相関係数

spearman

スピアマン順位相関係数

例:

1. 2 つのシリーズ間の相関関係

s1 = pd.Series(np.random.randn(10))
s2 = s1*2

#相关性(s1与s2)
s1.corr(s2)

#输出结果:
0.9999999999999999

 2. 3つのデータセット(データフレーム)間の相関関係

s1 = pd.Series(np.random.randn(10))
s2 = s1*2
s3 = pd.Series(np.random.randn(10))
df = pd.DataFrame({
    's1':s1,
    's2':s2,
    's3':s3
})

df
# 输出dataframe
        s1	        s2	       s3
0	-1.149359	-2.298718	0.742016
1	0.476084	0.952168	-0.375759
2	-0.998627	-1.997255	0.721653
3	1.047331	2.094663	-0.078039
4	0.444710	0.889420	-0.525895
5	-0.411778	-0.823557	-0.402789
6	-0.935911	-1.871822	-0.597614
7	-0.652570	-1.305140	0.636498
8	1.055361	2.110722	-0.763907
9	-1.222631	-2.445262	-0.153914


# 三者相关性
df.corr()

#输出结果:
        s1	       s2	       s3
s1	1.000000	1.000000	-0.548589
s2	1.000000	1.000000	-0.548589
s3	-0.548589	-0.548589	1.000000

3.4 データランキング.rank()

.rank() メソッドは、関係にグループのランク平均が割り当てられるデータ ランクを生成します。次に例を示します。

s = pd.Series([877,865,874,890,912])
s

#输出结果:
0    877
1    865
2    874
3    890
4    912
dtype: int64



s.rank()
#输出结果:
0    3.0
1    1.0
2    2.0
3    4.0
4    5.0
dtype: float64

データフレームでは、rank() は行 (  axis=0) または列 (  axis=1) をランク付けできます。NaN値はランキングから除外されます。

rankascendingオプションで、デフォルトが true になる引数を受け取ります。false の場合、データは逆にランク付けされ、より大きな値にはより小さなランクが割り当てられます。

rankさまざまな描画メソッドがサポートされており、method パラメータで指定されます。

  • average:同率グループの平均順位

  • min:グループ内で最下位のランク

  • max:グループ内最高位

  • first: 配列内に出現する順序で割り当てられるランク

4. ウィンドウ関数

pandas には、ウィンドウ操作 (値のスライディング パーティションに対して集計を実行する操作) を実行するための API のコンパクトなセットが含まれています。APIは、ウィンドウ処理メソッドを呼び出してから集計関数を呼び出すために必要なパラメーターを備えたAPI groupbySeries、およびDataFrameと同様に機能します。

pandas は 4 種類のウィンドウ操作をサポートしています。

  1. タンブリング ウィンドウ: 値に対する一般的な固定または可変のスライディング ウィンドウ。

  2. 重み付きウィンドウ: ライブラリによって提供される重み付き非長方形ウィンドウscipy.signal

  3. 拡張ウィンドウ: 値が累積されるウィンドウ。

  4. 指数関数的に重み付けされたウィンドウ: 値の累積的かつ指数関数的に重み付けされたウィンドウ。

コンセプト

方法

返されたオブジェクト

時間ベースのウィンドウのサポート

チェーンされた groupby をサポート

サポートテーブル方式

オンライン運用をサポート

ローラーシャッター

rolling

Rolling

はい

はい

はい>1.3

いいえ

重み付けウィンドウ

rolling

Window

いいえ

いいえ

いいえ

いいえ

ウィンドウを拡大する

expanding

Expanding

いいえ

はい

はい>1.3

いいえ

指数関数的に重み付けされたウィンドウ

ewm

ExponentialMovingWindow

いいえ

>1.2です

いいえ

はい (バージョン 1.3 以降)

 例:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10,4))
df
#输出结果:
        0	        1	         2	       3
0	2.599818	0.451315	-0.428038	0.035233
1	0.395523	-0.098377	0.059649	-0.489922
2	0.550164	-0.469461	1.193710	0.567562
3	1.483434	-0.793989	-0.738174	0.515078
4	0.395409	0.425578	-0.439963	-0.207277
5	-0.035479	-1.438315	-0.863333	-0.129948
6	-0.336889	-0.094188	-1.452638	0.083352
7	-0.626117	0.120990	-0.566740	0.665003
8	-1.437816	-0.112235	-0.232150	-0.099910
9	-0.582537	0.388641	1.008226	0.321893

1. .rolling() ローリングシャッター

# 滚动窗口求每三行之间的平均值
df.rolling(window=3).mean()

#输出结果:

        0	        1	        2	      3
0	    NaN	       NaN	       NaN	      NaN
1	    NaN	       NaN	       NaN	      NaN
2	1.181835	-0.038841	0.275107	0.037625
3	0.809707	-0.453942	0.171729	0.197573
4	0.809669	-0.279291	0.005191	0.291788
5	0.614455	-0.602242	-0.680490	0.059284
6	0.007681	-0.368975	-0.918644	-0.084624
7	-0.332828	-0.470504	-0.960904	0.206135
8	-0.800274	-0.028478	-0.750509	0.216148
9	-0.882157	0.132465	0.069779	0.295662

 2. .expanding でウィンドウを展開します。

#expanding
df.expanding(min_periods=3).mean()

#输出结果:
        0	         1	        2	      3
0	     NaN	     NaN	     NaN	     NaN
1	     NaN	     NaN	     NaN	     NaN
2	1.181835	-0.038841	0.275107	0.037625
3	1.257235	-0.227628	0.021787	0.156988
4	1.084869	-0.096987	-0.070563	0.084135
5	0.898145	-0.320542	-0.202691	0.048455
6	0.721711	-0.288205	-0.381255	0.053440
7	0.553233	-0.237056	-0.404441	0.129885
8	0.332005	-0.223187	-0.385297	0.104352
9	0.240551	-0.162004	-0.245945	0.126106

おすすめ

転載: blog.csdn.net/damadashen/article/details/126901690