pandas ライブラリ -- DataFrame 共通操作


序文

この記事は引き続き更新され、日常業務で遭遇しやすい 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

おすすめ

転載: blog.csdn.net/bradyM/article/details/125485280