pandas示例

1-数据创建

import Pandas as pd
data = {'Time': pd.Timestamp('20201002'),
        'Stid': [ 54511, 54602, 53798, 53772], 
        'Name': ['Beijing','Baoding','Xingtai','Taiyuan'], 
        'Lon' : [ 110, 111, 112, 113],
        'Lat' : [ 35, 39, 40, 41],
        'Rain': [9999, 0.01, 50.,np.nan],
        'T': [30, 31, 32., 33],
        'Td': [20, 21, 22., 23.]}
df = pd.DataFrame(data)

注:pd.Timestamp('20201002')是 Pandas 中用于创建一个时间戳对象的函数调用,它会将字符串 '20201002' 解析为 2020-10-02 的日期格式。

pd.Timestamp 还支持多种日期字符串格式:

# 带分隔符的日期
pd.Timestamp('2020-10-02')  

# 带时间部分
pd.Timestamp('2020-10-02 12:34:56')  

# ISO 格式
pd.Timestamp('20201002T120000')  
 

所有信息

df.info()


RangeIndex: 4 entries, 0 to 3
Data columns (total 8 columns):
 #   Column  Non-Null Count  Dtype        
---  ------  --------------  -----        
 0   Time    4 non-null      datetime64[s]
 1   Stid    4 non-null      int64        
 2   Name    4 non-null      object       
 3   Lon     4 non-null      int64        
 4   Lat     4 non-null      int64        
 5   Rain    3 non-null      float64      
 6   T       4 non-null      float64      
 7   Td      4 non-null      float64      
dtypes: datetime64[s](1), float64(3), int64(3), object(1)
memory usage: 388.0+ bytes

快速统计

df.describe()

                      Time         Stid  ...          T         Td
count                    4      4.00000  ...   4.000000   4.000000
mean   2020-10-02 00:00:00  54170.75000  ...  31.500000  21.500000
min    2020-10-02 00:00:00  53772.00000  ...  30.000000  20.000000
25%    2020-10-02 00:00:00  53791.50000  ...  30.750000  20.750000
50%    2020-10-02 00:00:00  54154.50000  ...  31.500000  21.500000
75%    2020-10-02 00:00:00  54533.75000  ...  32.250000  22.250000
max    2020-10-02 00:00:00  54602.00000  ...  33.000000  23.000000
std                    NaN    447.09833  ...   1.290994   1.290994

[8 rows x 7 columns]

索引信息

df.index

RangeIndex(start=0, stop=4, step=1)

列名信息

df.columns

Index(['Time', 'Stid', 'Name', 'Lon', 'Lat', 'Rain', 'T', 'Td'], dtype='object')

数据类型

df.dtypes

Time    datetime64[s]
Stid            int64
Name           object
Lon             int64
Lat             int64
Rain          float64
T             float64
Td            float64
dtype: object

改变数据类型

df['Lon']=df['Lon'].astype('float32')

df.dtypes

Time    datetime64[s]
Stid            int64
Name           object
Lon           float32
Lat             int64
Rain          float64
T             float64
Td            float64
dtype: object

转化为ndarray数组

df_change=df.to_numpy()

2020-10-02 00:00:00    54511    Beijing    110.0    35    9999.0    30.0
2020-10-02 00:00:00    54602    Baoding    111.0    39    0.01    31.0
2020-10-02 00:00:00    53798    Xingtai    112.0    40    50.0    32.0
2020-10-02 00:00:00    53772    Taiyuan    113.0    41    nan    33.0

请注意,当Dataframe具有不同数据类型的列时,这可能是一个“昂贵的”操作,这归结为pandas和NumPy之间的根本区别——

  • NumPy数组对整个数组有一个数据类型

  • 而pandas数据帧对每列有一个数据类型

2-索引切片 

df.head()  #头5行

df.tail(3)  #末3行

df[1:3] #按照整数位置/行号筛选

        Time   Stid     Name    Lon  Lat   Rain     T    Td
1 2020-10-02  54602  Baoding  111.0   39   0.01  31.0  21.0
2 2020-10-02  53798  Xingtai  112.0   40  50.00  32.0  22.0

df.loc[2] #按照标签选择行(标签就是行的索引,默认为0,1,2,……,可以用index()方法进行改变)

返回行数索引为2的行的数据

Time    2020-10-02 00:00:00
Stid                  53798
Name                Xingtai
Lon                   112.0
Lat                      40
Rain                   50.0
T                      32.0
Td                     22.0
Name: 22, dtype: object

使用 df.loc[2] 的说明:

df.loc[2] 是 Pandas 中用于通过标签(label-based)选择数据的方法。它返回 DataFrame 中标签为 2 的行数据。

  • 如果 DataFrame 的索引(index)包含标签 2df.loc[2] 会返回该行的所有列数据。
  • 如果索引不包含 2,会引发 KeyError 异常。

假设有一个 DataFrame 如下:

import pandas as pd
data = {'A': [1, 2, 3], 'B': [4, 5, 6]}
df = pd.DataFrame(data, index=[0, 1, 2])
 

调用 df.loc[2] 会返回:

A    3
B    6
Name: 2, dtype: int64
 

选择多行数据,传递列表选择多个标签的行:

rows = df.loc[[0, 2]]  # 返回标签为0和2的行
 

结合列选择,通过标签选择行后,再选择特定列:

value = df.loc[2, 'A']  # 返回标签为2、列'A'的值
 

注意事项

  • 如果索引是默认的整数序列(如 0, 1, 2),df.loc[2] 和 df.iloc[2] 的结果可能相同,但逻辑不同:.loc 基于标签,.iloc 基于位置。
  • 确保索引标签存在,否则会报错。可通过 2 in df.index 检查标签是否存在。

df.loc[1:3] #按照标签选择行 

df.loc[1:3] #按照标签选择行

        Time   Stid     Name    Lon  Lat   Rain     T    Td
1 2020-10-02  54602  Baoding  111.0   39   0.01  31.0  21.0
2 2020-10-02  53798  Xingtai  112.0   40  50.00  32.0  22.0
3 2020-10-02  53772  Taiyuan  113.0   41    NaN  33.0  23.0

df.iloc[0]  #按照整数位置/行号筛选 

df.iloc[3]

Time    2020-10-02 00:00:00
Stid                  53772
Name                Taiyuan
Lon                   113.0
Lat                      41
Rain                    NaN
T                      33.0
Td                     23.0
Name: 3, dtype: object

df.iloc[[0,1]]

        Time   Stid     Name    Lon  Lat     Rain     T    Td
0 2020-10-02  54511  Beijing  110.0   35  9999.00  30.0  20.0
1 2020-10-02  54602  Baoding  111.0   39     0.01  31.0  21.0

df.iloc[[0],[1]]   即行号为0,列号为1的某个数据

    Stid
0  54511

df.iloc[[0,1],[0,1]]

        Time   Stid
0 2020-10-02  54511
1 2020-10-02  54602

df.iloc[0:2,[0,1]]

        Time   Stid
0 2020-10-02  54511
1 2020-10-02  54602

df.iloc[:, [5,1]]

      Rain   Stid
0  9999.00  54511
1     0.01  54602
2    50.00  53798
3      NaN  53772
4   111.00  11111

df['Rain'] #按照列名进行索引

0    9999.00
1       0.01
2      50.00
3        NaN
4     111.00
Name: Rain, dtype: float64

df.Rain

0    9999.00
1       0.01
2      50.00
3        NaN
4     111.00
Name: Rain, dtype: float64

df[['Rain','Time']]

      Rain       Time
0  9999.00 2020-10-02
1     0.01 2020-10-02
2    50.00 2020-10-02
3      NaN 2020-10-02
4   111.00 2020-10-02

df[df.columns[5]] 

0    9999.00
1       0.01
2      50.00
3        NaN
4     111.00
Name: Rain, dtype: float64

df[::-1]  ,所有行进行倒序排列

        Time   Stid     Name    Lon  Lat     Rain     T    Td
4 2020-10-02  11111    gansu  111.0   11   111.00  34.0  15.0
3 2020-10-02  53772  Taiyuan  113.0   41      NaN  33.0  23.0
2 2020-10-02  53798  Xingtai  112.0   40    50.00  32.0  22.0
1 2020-10-02  54602  Baoding  111.0   39     0.01  31.0  21.0
0 2020-10-02  54511  Beijing  110.0   35  9999.00  30.0  20.0

df[::2] 

        Time   Stid     Name    Lon  Lat    Rain     T    Td
0 2020-10-02  54511  Beijing  110.0   35  9999.0  30.0  20.0
2 2020-10-02  53798  Xingtai  112.0   40    50.0  32.0  22.0
4 2020-10-02  11111    gansu  111.0   11   111.0  34.0  15.0

3-筛选重置

df1=df[df['Rain']<999] ,注意语法,会选出rain小于999的行

df

        Time   Stid     Name    Lon  Lat    Rain     T    Td
1 2020-10-02  54602  Baoding  111.0   39    0.01  31.0  21.0
2 2020-10-02  53798  Xingtai  112.0   40   50.00  32.0  22.0
4 2020-10-02  11111    gansu  111.0   11  111.00  34.0  15.0

df1=df[(df['Lat']>40) & (df['Rain']<999)]

df1

Empty DataFrame
Columns: [Time, Stid, Name, Lon, Lat, Rain, T, Td]
Index: []

判断某些站点是否在其中

whitelist=[54511,53798,53772]
df2=df[df.Stid.isin(whitelist)]

df2

        Time   Stid     Name    Lon  Lat    Rain     T    Td
0 2020-10-02  54511  Beijing  110.0   35  9999.0  30.0  20.0
2 2020-10-02  53798  Xingtai  112.0   40    50.0  32.0  22.0
3 2020-10-02  53772  Taiyuan  113.0   41     NaN  33.0  23.0

  • df.Stid:访问dfStid列(站点ID列)。
  • .isin(whitelist):检查Stid列中的每个值是否存在于whitelist列表中,返回布尔值(True/False)。
  • df[...]:利用布尔索引筛选df,仅保留Stid值在whitelist中的行。

使用 df.query() 筛选特定值

在 Pandas 中,df.query()(query,查询的意思)方法可用于筛选 DataFrame 中符合特定条件的数据行。当需要筛选 Stid 列中包含特定值(如 54602 和 53798)的行时,可以使用以下方法:

df.query('Stid==[54511,53772]')

        Time   Stid     Name    Lon  Lat    Rain     T    Td
0 2020-10-02  54511  Beijing  110.0   35  9999.0  30.0  20.0
3 2020-10-02  53772  Taiyuan  113.0   41     NaN  33.0  23.0

df.query('Stid==53798 or Stid==54602')

        Time   Stid     Name    Lon  Lat   Rain     T    Td
1 2020-10-02  54602  Baoding  111.0   39   0.01  31.0  21.0
2 2020-10-02  53798  Xingtai  112.0   40  50.00  32.0  22.0

df.query('Stid in [54602,53798]')

        Time   Stid     Name    Lon  Lat   Rain     T    Td
1 2020-10-02  54602  Baoding  111.0   39   0.01  31.0  21.0
2 2020-10-02  53798  Xingtai  112.0   40  50.00  32.0  22.0

df['NoTlogP'] = df['Stid'].where(df['Stid'] == 54602)
       

        Time   Stid     Name    Lon  Lat     Rain     T    Td  NoTlogP
0 2020-10-02  54511  Beijing  110.0   35  9999.00  30.0  20.0      NaN
1 2020-10-02  54602  Baoding  111.0   39     0.01  31.0  21.0  54602.0
2 2020-10-02  53798  Xingtai  112.0   40    50.00  32.0  22.0      NaN
3 2020-10-02  53772  Taiyuan  113.0   41      NaN  33.0  23.0      NaN

这段代码使用 Pandas 的 where 方法对 DataFrame 的列进行条件筛选和赋值操作,该操作会在 DataFrame df 中创建一个新列 NoTlogP,其值基于以下规则:

  • 当 Stid 列的值等于 54602 时,NoTlogP 列将保留 Stid 的原值
  • 当 Stid 列的值不等于 54602 时,NoTlogP 列将显示为 NaN(默认填充值)

参数扩展

where 方法可以接受其他参数:

df['NoTlogP'] = df['Stid'].where(df['Stid'] == 54602, other=0)  # 将不满足条件的值设为0
 

注意事项

  • 原始 DataFrame df 必须包含 Stid 列
  • 操作会修改原 DataFrame,添加新列 NoTlogP
  • 默认情况下不满足条件的值会被设为 NaN,需要使用 fillna() 处理后续计算。

df['flag'] = df['Rain']<999 

        Time   Stid     Name    Lon  Lat     Rain     T    Td   flag
0 2020-10-02  54511  Beijing  110.0   35  9999.00  30.0  20.0  False
1 2020-10-02  54602  Baoding  111.0   39     0.01  31.0  21.0   True
2 2020-10-02  53798  Xingtai  112.0   40    50.00  32.0  22.0   True
3 2020-10-02  53772  Taiyuan  113.0   41      NaN  33.0  23.0  False

添加降雨标志列:

在 Pandas 数据框 df 中创建名为 'flag' 的新列,该列将根据 'Rain' 列的值生成布尔值标志。当 'Rain' 列的值小于 999 时,'flag' 列为 True,否则为 False

代码说明

  • df['Rain'] < 999:对 'Rain' 列进行元素级比较,生成一个布尔值 Series。
  • df['flag'] = ...:将布尔值 Series 赋值给新列 'flag'

 df['T-Td'] = df['T'] -df['Td']

        Time   Stid     Name    Lon  Lat     Rain     T    Td   flag  T-Td
0 2020-10-02  54511  Beijing  110.0   35  9999.00  30.0  20.0  False  10.0
1 2020-10-02  54602  Baoding  111.0   39     0.01  31.0  21.0   True  10.0
2 2020-10-02  53798  Xingtai  112.0   40    50.00  32.0  22.0   True  10.0
3 2020-10-02  53772  Taiyuan  113.0   41      NaN  33.0  23.0  False  10.0

执行温度差计算

将数据框 df 中的列 'T' 与列 'Td' 逐行相减,结果存储在新列 'T-Td' 中。

注意事项

确保 df 中的 'T' 和 'Td' 列均为数值类型(如 float 或 int),否则需先转换数据类型:

df['T'] = pd.to_numeric(df['T'])
df['Td'] = pd.to_numeric(df['Td'])
 

若存在缺失值,计算结果会变为 NaN,可通过 fillna() 提前处理:

df['T'].fillna(0, inplace=True)
df['Td'].fillna(0, inplace=True)
 

直接插入新列

nameCN=pd.Series(['北京', '保定', '邢台', '太原'])

df.insert(1,'站点中文',nameCN)

        Time 站点中文   Stid     Name    Lon  Lat     Rain     T    Td   flag
0 2020-10-02   北京  54511  Beijing  110.0   35  9999.00  30.0  20.0  False
1 2020-10-02   保定  54602  Baoding  111.0   39     0.01  31.0  21.0   True
2 2020-10-02   邢台  53798  Xingtai  112.0   40    50.00  32.0  22.0   True
3 2020-10-02   太原  53772  Taiyuan  113.0   41      NaN  33.0  23.0  False

4-删除

df.drop('flag',axis=1)

        Time 站点中文   Stid     Name    Lon  Lat     Rain     T    Td
0 2020-10-02   北京  54511  Beijing  110.0   35  9999.00  30.0  20.0
1 2020-10-02   保定  54602  Baoding  111.0   39     0.01  31.0  21.0
2 2020-10-02   邢台  53798  Xingtai  112.0   40    50.00  32.0  22.0
3 2020-10-02   太原  53772  Taiyuan  113.0   41      NaN  33.0  23.0

删除 Pandas 数据框中的列

使用 df.drop() 方法可以删除 Pandas 数据框中的指定列。以下是具体操作方法:

df = df.drop('flag', axis=1)
 

axis=1 表示操作对象为列而非行。该方法会返回删除列后的新数据框,原数据框不会被修改

直接修改原数据框

df.drop('flag', axis=1, inplace=True)
 

inplace=True 参数会在原数据框上直接删除列,不返回新数据框。

删除多列

df = df.drop(['flag', 'column2'], axis=1)
 

df.pop('column_name') 

在 Pandas 中,df.pop('column_name') 方法可以移除指定列并返回该列的数据。该方法直接修改原 DataFrame,适用于需要删除列并同时使用其数据的情况。

import pandas as pd

# 示例 DataFrame
data = {'level': [1, 2, 3], 'value': ['A', 'B', 'C']}
df = pd.DataFrame(data)

# 移除 'level' 列并返回该列数据
removed_column = df.pop('level')

# 查看结果
print("移除后的 DataFrame:\n", df)
print("被移除的列数据:\n", removed_column)
 

输出示例

移除后的 DataFrame:
   value
0     A
1     B
2     C

被移除的列数据:
0    1
1    2
2    3
Name: level, dtype: int64
 

pop() 与 drop() 的区别

  • pop()

    • 直接修改原 DataFrame。
    • 返回被移除的列数据(Series 类型)。
    • 仅能删除单列。
  • drop()

    • 需通过参数 inplace=True 修改原 DataFrame。
    • 可同时删除多列(通过列表指定列名)。
    • 不返回被删除的列数据。

注意事项

  • 若列名不存在,pop() 会引发 KeyError。建议先检查列是否存在:

if 'level' in df.columns:
    removed_data = df.pop('level')
 

如果需要保留原 DataFrame,建议先复制数据:

df_copy = df.copy()
removed_data = df_copy.pop('level')
 

del df['T-Td']

此方法直接操作原 DataFrame,无需额外参数。

你可能感兴趣的:(pandas,机器学习,人工智能)