記事ディレクトリ
序文
この記事は引き続き更新され、日常業務で遭遇しやすい pandas ライブラリ DataFrame の一般的な操作が記録されます。
1.DataFrame の作成
1. リスト (または numpy.ndarray) に基づいて作成する
data = [['Jack', 10], ['Tom', 12], ['Lucy', 13]]
columns = ['Name', 'Age']
df_by_list = pd.DataFrame(data, columns=columns)
print(df_by_list)
出力:
Name Age
0 Jack 10
1 Tom 12
2 Lucy 13
2.辞書作成に基づく
row = {
'Name': ['Jack', 'Tom', 'Lucy'],
'Age': [10, 12, 13]
}
df_by_dict = pd.DataFrame(row)
print(df_by_dict)
出力:
Name Age
0 Jack 10
1 Tome 12
2 Lucy 13
3. csvファイルの読み込み方法
csv ファイルのスタイル:
df = pd.read_csv('city.csv')
print(df.head(5))
出力:
id name province city
0 101010100 北京 北京市 北京市
1 101010200 海淀 北京市 海淀
2 101010300 朝阳 北京市 朝阳
3 101010400 顺义 北京市 顺义
4 101010500 怀柔 北京市 怀柔
2. クエリ
1. df ダイレクト クエリ
①カラムを問い合わせる
names = df['Name'].tolist()
print(names)
出力:
['Jack', 'Tom', 'Lucy']
②複数列のクエリ
names = df[['Name','Age']]
print(names)
出力:
Name Age
0 Jack 10
1 Tom 12
2 Lucy 13
③条件問い合わせ
ages = df[(df['Age'] > 10) & (df['Age'] < 13)]
print(ages)
出力:
Name Age
1 Tom 12
2. query() メソッド
①条件問合せ
result = df.query('Age > 10 & Age < 13')
print(result)
出力:
Name Age
1 Tom 12
② 変数を使ったクエリ (@variable を使用)
names = ['Tom', 'Lily', 'Sam']
result = df.query('Name not in @names')
print(result)
出力:
Name Age
0 Jack 10
2 Lucy 13
3. 行インデックス値のクエリ
たとえば、Name フィールドが Tom である行インデックスを確認したいとします。
print(df)
index = df[df['Name'] == "Tom"].index.tolist()[0] # 查询索引
print("Tom所在行的索引:", index)
出力:
Name Age
0 Jack 10
1 Tom 12
2 Lucy 13
Tom所在行的索引: 1
4. あいまいクエリ (文字列型である必要があります)
たとえば、Sdate フィールドに対してファジー クエリを実行して、2023 年のデータをクエリしたいとします。
data = [['20201001', 10], ['20201002', 12], ['20201003', 13],['20231003', 13]]
columns = ['Sdate', 'type']
df = pd.DataFrame(data, columns=columns)
df = df[df['Sdate'].str.contains('2023')] # 模糊查询
print(df)
出力:
Sdate type
3 20231003 13
このファジー クエリ メソッドは、正規表現もサポートしています。たとえば、2023 年から始まるデータをクエリしたいとします。
data = [['20201001', 10], ['20201002', 12], ['20202303', 13],['20231003', 13]]
columns = ['Sdate', 'type']
df = pd.DataFrame(data, columns=columns)
df = df[df['Sdate'].str.contains('^2023')] # 正则表示
print(df)
出力:
Sdate type
3 20231003 13
三、増やす
1.列を追加する
①直接追加:最後の列に新しい列を追加
df['Gender'] = ['M', 'M', 'F']
print(df)
出力:
Name Age Gender
0 Jack 10 M
1 Tom 12 M
2 Lucy 13 F
②挿入方法:追加する場所を指定できます
df.insert(0, 'Gender', ['M', 'M', 'F'])
print(df)
出力:
Gender Name Age
0 M Jack 10
1 M Tom 12
2 F Lucy 13
2.行を追加
①loc関数:一行追加
df.loc[len(df.index)] = ('Lily', 20)
print(df)
出力:
Name Age
0 Jack 10
1 Tom 12
2 Lucy 13
3 Lily 20
注:最後の行に追加されていない場合、データは次のように置き換えられます。
df.loc[1] = ('Lily', 20)
print(df)
出力:
Name Age
0 Jack 10
1 Lily 20
2 Lucy 13
②複数行追加
data1 = [['Lily', 23], ['Sam', 35]]
columns1 = ['Name', 'Age']
df1 = pd.DataFrame(data1, columns=columns1)
df2 = pd.concat([df, df1], ignore_index=True)
print(df2)
出力:
Name Age
0 Jack 10
1 Tom 12
2 Lucy 13
3 Lily 23
4 Sam 35
注:
1. ignore_index=True パラメーターは、インデックスをリセットすることを意味します
2. append メソッドは廃止されようとしています。concat メソッドを使用することをお勧めします
3. concat メソッドでは、2 つの dfs が同じ列名である必要があります
四、アップデート(変更)
1. 行の値全体を更新する
data1 = [['Lily', 23], ['Sam', 35]]
columns1 = ['Name', 'Age']
new_df = pd.DataFrame(data1, columns=columns1)
df.update(new_df)
print(df)
出力:
Name Age
0 Lily 23.0
1 Sam 35.0
2 Lucy 13.0
2.値を更新する
①連続数値インデックスによる修正:
df.iloc[0, 1] = 25 # 0表示按顺序数的第一行,1表示第二列
print(df)
出力:
Name Age
0 Jack 25
1 Tom 12
2 Lucy 13
②実際にindexを設定して修正:
df.loc[0, 'Age'] = 25 # 0表示索引等于0的那一行
print(df)
出力:
Name Age
0 Jack 25
1 Tom 12
2 Lucy 13
3. 列全体の数値型を更新する
たとえば、Sdate 列を数値型から文字列型に変更します。
data = [[20201001, 10], [20201002, 12], [20201003, 13]]
columns = ['Sdate', 'type']
df = pd.DataFrame(data, columns=columns)
print(df)
print("Sdate开始类型:",df['Sdate'].dtypes)
df['Sdate'] = pd.Series(df['Sdate'], dtype="string") # 更改类型
print("Sdate改变后类型:",df['Sdate'].dtypes)
出力:
Sdate type
0 20201001 10
1 20201002 12
2 20201003 13
Sdate开始类型: int64
Sdate改变后类型: string
4.列の日付のフォーマットを調整する(文字列/オブジェクト型)
たとえば、Sdate 列の「20201001」形式を「2020-10-01」形式に変換します。
data = [['20201001', 10], ['20201002', 12], ['20201003', 13]]
columns = ['Sdate', 'type']
df = pd.DataFrame(data, columns=columns)
print(df)
# pd.to_datetime(df['Sdate']) 把 Sdate这一列转换为datetime64[ns]时间数据类型
df['Sdate'] = pd.to_datetime(df['Sdate']).dt.strftime('%Y-%m-%d') # 格式化
print(df)
出力:
Sdate type
0 20201001 10
1 20201002 12
2 20201003 13
Sdate type
0 2020-10-01 10
1 2020-10-02 12
2 2020-10-03 13
5. 削除
1.行を削除
df = df.drop(df[(df['Age'] > 10) & (df['Age'] < 13)].index)
print(df)
出力:
Name Age
0 Jack 10
2 Lucy 13
2.列を削除する
df = df.drop('Age', axis=1)
print(df)
出力:
Name
0 Jack
1 Tom
2 Lucy
注意:
DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False)
- labels: リストで指定された、削除する行または列
- axis: デフォルトは 0 です。これは行が削除されることを意味し、列を削除するときは軸を 1 として指定する必要があります
- index : 削除する行を直接指定し、リストをパラメーターとして使用して複数の行を削除できます
- 列: 削除する列を直接指定します. 複数の列を削除するには, リストをパラメーターとして使用できます.
- inplace: デフォルトは False で、削除操作は元のデータを変更しません; inplace = True の場合、元のデータは変更されます
六、横断
for index, row in df.iterrows():
print(index)
print(row['Name'])
print(row['Age'])
出力:
0 Jack 10
1 Tom 12
2 Lucy 13
注: iterrows() の戻り値はタプル (index, row) で、index は行インデックス、row は行のすべてのデータで、フィールド名から取得できます。
セブン、コンバージョン
1.ディクショナリとデータフレームの相互変換
参考記事:https://blog.csdn.net/m0_43609475/article/details/125328938
2. データ型変換
df = pd.read_csv('energy.csv', encoding='gb2312')
print(df.dtypes)
df['能量值'] = df['能量值'].astype(object)
print("=====================================")
print(df.dtypes)
出力:
日期 object
能量值 int64
电量值 float64
dtype: object
=====================================
日期 object
能量值 object
电量值 float64
dtype: object
3. Nan 値を None 値に変換する
理由: pandas の空の値は NaN で表されます.データベースに挿入する場合、NaN を None 値に変換する必要があります。変換しないと、エラーが報告されます
df = pd.read_csv('energy.csv', encoding='gb2312')
print(df)
# df.astype(object) ==> DataFram : 先把表中所有类型改为object
# df.where(条件式,值) ==> DataFram: 在满足条件式的位置保留原值,在不满足条件的位置填充自设的值
# pd.notnull(df) ==> DataFram: 返回一个布尔类型的df,NaN位置为False,其余位置为True
print("=====================================")
df = df.astype(object).where(pd.notnull(df), None)
print(df)
出力:
日期 能量值 电量值
0 2020-06-06 2900 NaN
1 2020-06-07 3300 0.0
2 2020-06-08 666 666.0
=====================================
日期 能量值 电量值
0 2020-06-06 2900 None
1 2020-06-07 3300 0.0
2 2020-06-08 666 666.0
8. その他
1. Nan 値を含む行を削除する
df = pd.read_csv('energy.csv', encoding='gb2312')
print(df)
print("==========================================")
result = df.drop(df[df.isnull().T.any()].index)
print(result)
出力:
日期 能量值 电量值
0 2020-06-06 2900 NaN
1 2020-06-07 3300 0.0
2 2020-06-08 666 666.0
==========================================
日期 能量值 电量值
1 2020-06-07 3300 0.0
2 2020-06-08 666 666.0
説明:
df = pd.read_csv('energy.csv', encoding='gb2312')
print(df)
print("==========================================")
print("df.isnull():")
print(df.isnull())
print("==========================================")
print("df.isnull().T:")
print(df.isnull().T)
print("==========================================")
print("df.isnull().T.any():")
print(df.isnull().T.any()) # any()==> Series: 返回任何元素是否为真(可能在轴上)。
print("==========================================")
print("df[df.isnull().T.any()]:")
print(df[df.isnull().T.any()])
print("==========================================")
print("df[df.isnull().T.any()].index:")
print(df[df.isnull().T.any()].index)
出力:
日期 能量值 电量值
0 2020-06-06 2900 NaN
1 2020-06-07 3300 0.0
2 2020-06-08 666 666.0
==========================================
df.isnull():
日期 能量值 电量值
0 False False True
1 False False False
2 False False False
==========================================
df.isnull().T:
0 1 2
日期 False False False
能量值 False False False
电量值 True False False
==========================================
df.isnull().T.any():
0 True
1 False
2 False
dtype: bool
==========================================
df[df.isnull().T.any()]:
日期 能量值 电量值
0 2020-06-06 2900 NaN
==========================================
df[df.isnull().T.any()].index:
Int64Index([0], dtype='int64')
2.参加操作
df1 = pd.read_csv('energy.csv', encoding='gb2312')
df2 = pd.read_csv('energy.csv', encoding='gb2312')
result = pd.merge(df1, df2, how='left', on=['日期']) # df1 left join df2
print(result)
出力:
日期 能量值_x 电量值_x 能量值_y 电量值_y
0 2020-06-06 2900 NaN 2900 NaN
1 2020-06-07 3300 0.0 3300 0.0
2 2020-06-08 666 666.0 666 666.0