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
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数据帧对每列有一个数据类型
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
返回行数索引为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
的行数据。
2
,df.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] #按照标签选择行
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[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
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
Stid
0 54511
Time Stid
0 2020-10-02 54511
1 2020-10-02 54602
Time Stid
0 2020-10-02 54511
1 2020-10-02 54602
Rain Stid
0 9999.00 54511
1 0.01 54602
2 50.00 53798
3 NaN 53772
4 111.00 11111
0 9999.00
1 0.01
2 50.00
3 NaN
4 111.00
Name: Rain, dtype: float64
0 9999.00
1 0.01
2 50.00
3 NaN
4 111.00
Name: Rain, dtype: float64
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
0 9999.00
1 0.01
2 50.00
3 NaN
4 111.00
Name: Rain, dtype: float64
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
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
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
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
:访问df
的Stid
列(站点ID列)。.isin(whitelist)
:检查Stid
列中的每个值是否存在于whitelist
列表中,返回布尔值(True/False)。df[...]
:利用布尔索引筛选df
,仅保留Stid
值在whitelist
中的行。df.query()
筛选特定值在 Pandas 中,df.query()(query,查询的意思)
方法可用于筛选 DataFrame 中符合特定条件的数据行。当需要筛选 Stid
列中包含特定值(如 54602
和 53798
)的行时,可以使用以下方法:
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
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
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
注意事项
df
必须包含 Stid
列NoTlogP
NaN
,需要使用 fillna()
处理后续计算。 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'
。 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
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()
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')
此方法直接操作原 DataFrame,无需额外参数。