【数据分析(二)】初探 Pandas
目录
- 引言
- 1. 基本数据结构
- 1.1. Series 的初始化和简单操作
- 1.2. DataFrame 的初始化和简单操作
- 1.2.1. 初始化与持久化
- 1.2.2. 读取查看
- 1.2.3. 行操作
- 1.2.4. 列操作
- 1.2.5. 选中筛查
- 2. 数据预处理
- 2.0. 生成样例表
- 2.1. 缺失值处理
- 2.2. 类型转换和排序
- 2.3. 统计分析
- 3. 数据透视
- 3.0. 生成样例表
- 3.1. 生成透视表
- 4. 数据重塑
- 4.1. 层次化索引
- 4.1.1. 双层索引的Series
- 4.1.2. 双层索引的Dataframe
- 4.2. 离散化处理
- 4.2.1. 分组运算
- 4.2.2. 分级标签
- 4.3. 数据集合并
引言
Pandas (Python Data Analysis Library)
是基于Numpy
的一种用于数据分析的工具包,其中纳入了大量库和一些标准数据模型,提供了高效操作大型数据集所需的工具。
以下对Pandas
库函数的介绍中,已传入的参数为默认值,并且无返回值的函数不会以赋值形式演示。
1. 基本数据结构
1.1. Series 的初始化和简单操作
Pandas
中的Series
,与Numpy
中的array
和Python
中的基本数据结构list
类似,是一种能保存不同数据类型的一维数组。
s = pd.Series(data, index, dtype, name, copy)
data
:类数组array-like
或者字典dict
。类数组的索引(自然数序列)作为Series
的索引s.index
,元素作为Series
的值s.values
;字典的键作为s.index
,值作为s.values
index
:类数组array-like
。重新指定s.index
,若data
为array-like
,则依序匹配;若data
为dict
,则s.values
为空值np.nan
dtype
:数据类型或其字符串str
。重新指定Series
的类型s.dtype
。name
:不可变对象hashable
,包括字符串,数字,元组等。指定Series
的名称s.name
,默认为None
。
import pandas as pd
import numpy as np# 默认行标签建表,并查看索引和值
s1 = pd.Series([-1, 0.7, False, np.nan])
'''
0 -1
1 0.7
2 False
3 NaN
dtype: object
'''
print(s1.values) # [-1 0.7 False nan]
print(s1.index) # RangeIndex(start=0, stop=4, step=1)# 设定行标签、表格名称和索引名称
s2 = pd.Series([-1, 0.7, False, np.nan], index=list('abcd'), name='demo')
s2.index.name = 'index'
'''
index
a -1
b 0.7
c False
d NaN
Name: demo, dtype: object
'''
print(s2.values) # [-1 0.7 False nan]
print(s2.index) # Index(['a', 'b', 'c', 'd'], dtype='object')# 查询值
print(s1[3]) # nan
print(s2['d'])# 切片:标签闭区间
print(s1[::2])
'''
0 -1
2 False
dtype: object
'''print(s2['a':'c'])
'''
a -1
b 0.7
c False
Name: demo, dtype: object
'''
1.2. DataFrame 的初始化和简单操作
Pandas
中的DataFrame
,与R
中的data.frame
类似,是一种二维表格型数据结构,相当于Series
的容器。
1.2.1. 初始化与持久化
import pandas as pd
import numpy as np# 1.字典建表
df = pd.DataFrame({'A': pd.Timestamp('20250110'), 'B': pd.Series(0, index=list(range(4))), 'C': np.array([1]*4), 'D': 2,'E': pd.Categorical(['test', 'train', 'test', 'train'])})
'''A B C D E
0 2025-01-10 0 1 2 test
1 2025-01-10 0 1 2 train
2 2025-01-10 0 1 2 test
3 2025-01-10 0 1 2 train
'''# 生成时序
date = pd.date_range('20250110', periods=5)
'''
DatetimeIndex(['2025-01-10', '2025-01-11', '2025-01-12', '2025-01-13','2025-01-14'],dtype='datetime64[ns]', freq='D')'''# 2.时序建表
df = pd.DataFrame(np.random.randn(5, 3), index=date, columns=list('xyz'))
'''x y z
2025-01-10 -0.274766 -0.593336 0.724735
2025-01-11 1.552149 -0.300292 0.061253
2025-01-12 0.411908 -0.470191 -0.893243
2025-01-13 -1.328169 -0.999390 -0.081419
2025-01-14 0.683950 -0.483677 -2.019955
'''# 保存表格:不额外添加索引
df.to_csv(r'E:\Pycharm_Python\course\demo.csv')
1.2.2. 读取查看
# 读取表格
df = pd.read_csv(r'E:\Pycharm_Python\course\demo.csv', index_col=0)# 查看头尾(默认5行)
print(df.head(2))
'''x y z
2025-01-10 -0.274766 -0.593336 0.724735
2025-01-11 1.552149 -0.300292 0.061253
'''
print(df.tail(1))
'''x y z
2025-01-14 0.68395 -0.483677 -2.019955
'''# 查看格式
print(df.dtypes)
'''
x float64
y float64
z float64
dtype: object
'''# 查看行标签
print(df.index)
'''Index(['2025-01-10', '2025-01-11', '2025-01-12', '2025-01-13', '2025-01-14'], dtype='object')'''# 查看列标签
print(df.columns)
'''Index(['x', 'y', 'z'], dtype='object')'''# 查看数据
print(df.values)
'''
[[-0.27476573 -0.59333579 0.72473541][ 1.55214904 -0.30029235 0.06125304][ 0.41190756 -0.47019098 -0.89324306][-1.32816905 -0.99938983 -0.08141872][ 0.6839496 -0.48367661 -2.01995517]]
'''
1.2.3. 行操作
# 读取表格
df = pd.read_csv(r'E:\Pycharm_Python\course\demo.csv', index_col=0)# 单行选中
print(df.iloc[1])
'''
x 1.552149
y -0.300292
z 0.061253
Name: 2025-01-11, dtype: float64
'''# 多行选中
# print(df.loc['20250113':'20250114'])
print(df.iloc[3:5])
'''x y z
2025-01-13 -1.328169 -0.999390 -0.081419
2025-01-14 0.683950 -0.483677 -2.019955
'''# 单行添加
df = df._append(pd.Series(dict(zip('xyz', np.random.randn(3))), name='2025-01-15'))
'''x y z
2025-01-10 -0.274766 -0.593336 0.724735
2025-01-11 1.552149 -0.300292 0.061253
2025-01-12 0.411908 -0.470191 -0.893243
2025-01-13 -1.328169 -0.999390 -0.081419
2025-01-14 0.683950 -0.483677 -2.019955
2025-01-15 1.205855 0.841471 0.843053
'''# 单行删除
df = df.drop(['2025-01-15'])
'''x y z
2025-01-10 -0.274766 -0.593336 0.724735
2025-01-11 1.552149 -0.300292 0.061253
2025-01-12 0.411908 -0.470191 -0.893243
2025-01-13 -1.328169 -0.999390 -0.081419
2025-01-14 0.683950 -0.483677 -2.019955
'''
1.2.4. 列操作
# 读取表格
df = pd.read_csv(r'E:\Pycharm_Python\course\demo.csv', index_col=0)# 单列选中
print(df['x'])
'''
2025-01-10 -0.274766
2025-01-11 1.552149
2025-01-12 0.411908
2025-01-13 -1.328169
2025-01-14 0.683950
Name: x, dtype: float64
'''# 多列选中
print(df[['x', 'z']])
'''x z
2025-01-10 -0.274766 0.724735
2025-01-11 1.552149 0.061253
2025-01-12 0.411908 -0.893243
2025-01-13 -1.328169 -0.081419
2025-01-14 0.683950 -2.019955
'''# 单列添加
df['p'] = np.random.rand(5)
'''x y z p
2025-01-10 -0.274766 -0.593336 0.724735 0.070785
2025-01-11 1.552149 -0.300292 0.061253 0.034027
2025-01-12 0.411908 -0.470191 -0.893243 0.446612
2025-01-13 -1.328169 -0.999390 -0.081419 0.545531
2025-01-14 0.683950 -0.483677 -2.019955 0.261958
'''# 单列删除
df = df.drop('p', axis=1)
print(df)
'''x y z
2025-01-10 -0.274766 -0.593336 0.724735
2025-01-11 1.552149 -0.300292 0.061253
2025-01-12 0.411908 -0.470191 -0.893243
2025-01-13 -1.328169 -0.999390 -0.081419
2025-01-14 0.683950 -0.483677 -2.019955
'''
1.2.5. 选中筛查
# 读取表格
df = pd.read_csv(r'E:\Pycharm_Python\course\demo.csv', index_col=0)# 单值选中
print(df.loc['2025-01-12', 'y'])
'''-0.47019098075848'''# 区域选中
# print(df.loc[['2025-01-12', '2025-01-13'], ['x', 'z']])
print(df[['x', 'z']][2:4])
'''x z
2025-01-12 0.411908 -0.893243
2025-01-13 -1.328169 -0.081419
'''# 条件判断
print(df['x'] > 0)
'''
2025-01-10 False
2025-01-11 True
2025-01-12 True
2025-01-13 False
2025-01-14 True
Name: x, dtype: bool
'''# 条件筛选
print(df[(df['x'] > 0)&(df['z'] > 0)])
'''x y z
2025-01-11 1.552149 -0.300292 0.061253
'''# 区间条件筛选
print(df[df['x'] > 0][1:4])
'''x y z
2025-01-12 0.411908 -0.470191 -0.893243
2025-01-14 0.683950 -0.483677 -2.019955
'''
2. 数据预处理
2.0. 生成样例表
import pandas as pd
import numpy as np# 生成时序
date = pd.date_range('20250110', periods=5)# 建表
df = pd.DataFrame(np.random.randn(5, 3), index=date, columns=list('xyz'))# 生成随机布尔表
mask = np.random.randint(0, 2, df.shape, dtype='bool')# 随机生成空值
df[pd.DataFrame(mask, index=df.index, columns=df.columns)] = np.nan# 保存表格
df.to_csv(r'E:\Pycharm_Python\course\demo_nan.csv')
2.1. 缺失值处理
isnull()
:返回一个与原表尺寸相同的布尔类型的表格,原表里的缺失值在其中对应位置上的值为True
,其余为False
fillna(value, inplace=False)
:返回将原表的缺失值填充为value
后的表格,inplace=True
时将原表格替换为输出(下同)replace(to_replace, value, inplace=False)
:返回原表的待替换值to_replace
全部替换为value
后的表格,前两个参数是列表时表示批量替换dropna(axis=0, inplace=False)
:返回将原表中含有缺失值的指定维度的记录删除后的表格
# 读取表格
df = pd.read_csv(r'E:\Pycharm_Python\course\demo_nan.csv', index_col=0)
'''x y z
2025-01-10 0.606495 NaN 0.456811
2025-01-11 NaN 0.743876 NaN
2025-01-12 0.024458 0.733735 NaN
2025-01-13 0.306332 NaN -0.586894
2025-01-14 NaN NaN NaN
'''# 判断缺失值
print(df.isnull())
'''x y z
2025-01-10 False True False
2025-01-11 True False True
2025-01-12 False False True
2025-01-13 False True False
2025-01-14 True True True
'''# 填充缺失值
print(df['x'].fillna(df['x'].mean()))
'''
2025-01-10 0.606495
2025-01-11 0.312428
2025-01-12 0.024458
2025-01-13 0.306332
2025-01-14 0.312428
Name: x, dtype: float64
'''print(df.fillna(0, inplace=True))
'''x y z
2025-01-10 0.606495 0.000000 0.456811
2025-01-11 0.000000 0.743876 0.000000
2025-01-12 0.024458 0.733735 0.000000
2025-01-13 0.306332 0.000000 -0.586894
2025-01-14 0.000000 0.000000 0.000000
'''# 替换缺失值
print(df.replace(np.nan, 0))# 删除缺失值
print(df.dropna())# 保存表格
df.to_csv(r'E:\Pycharm_Python\course\demo.csv')
2.2. 类型转换和排序
# 读取表格
df = pd.read_csv(r'E:\Pycharm_Python\course\demo.csv', index_col=0)# 类型转换
print(df.astype(bool))
'''x y z
2025-01-10 True False True
2025-01-11 False True False
2025-01-12 True True False
2025-01-13 True False True
2025-01-14 False False False
'''# 逆序排列
print(df.sort_values(by='x', ascending=False))
'''x y z
2025-01-10 0.606495 0.000000 0.456811
2025-01-13 0.306332 0.000000 -0.586894
2025-01-12 0.024458 0.733735 0.000000
2025-01-11 0.000000 0.743876 0.000000
2025-01-14 0.000000 0.000000 0.000000
'''# 有优先级的正序排列
print(df.sort_values(by=['z', 'y'], ascending=True))
'''x y z
2025-01-13 0.306332 0.000000 -0.586894
2025-01-14 0.000000 0.000000 0.000000
2025-01-12 0.024458 0.733735 0.000000
2025-01-11 0.000000 0.743876 0.000000
2025-01-10 0.606495 0.000000 0.456811
'''
2.3. 统计分析
# 描述性统计
print(df.describe())
'''x y z
count 5.000000 5.000000 5.000000
mean 0.187457 0.295522 -0.026017
std 0.267662 0.404676 0.370721
min 0.000000 0.000000 -0.586894
25% 0.000000 0.000000 0.000000
50% 0.024458 0.000000 0.000000
75% 0.306332 0.733735 0.000000
max 0.606495 0.743876 0.456811
'''# 最大值
print(df['x'].max()) # 0.606494812593188# 最小值
print(df['x'].min()) # 0.0# 均值
print(df['x'].mean()) # 0.18745690178195# 中值
print(df['x'].median()) # 0.0244579357029649# 方差
print(df['x'].var()) # 0.07164321143837143# 标准差
print(df['x'].std()) # 0.26766249538994336# 计数
print(df['z'].count()) # 5# 种类
print(df['z'].unique()) # [ 0.45681124 0. -0.58689448]# 分类计数
print(df['z'].value_counts())
'''
z0.000000 30.456811 1
-0.586894 1
'''# 求和
print(df.sum())
'''
x 0.937285
y 1.477611
z -0.130083
dtype: float64
'''# 相关系数
print(df.corr())
'''x y z
x 1.000000 -0.597883 0.306501
y -0.597883 1.000000 0.064061
z 0.306501 0.064061 1.000000
'''# 协方差
print(df.cov())
'''x y z
x 0.071643 -0.064761 0.030414
y -0.064761 0.163763 0.009611
z 0.030414 0.009611 0.137434
'''
3. 数据透视
3.0. 生成样例表
import pandas as pd
import numpy as np# 生成数据
hour = np.random.randint(0, 24, (1000, 1))
area = np.random.randint(0, 10, 1000)
displacement = np.random.randn(1000, 3)# 拼接表格
a = np.concatenate((hour, displacement), axis=1)
df = pd.DataFrame(a, index=area, columns=['hour', 'x', 'y', 'z'])
df.index.name = 'area'# 类型转换
df['hour'] = df['hour'].astype('int64')# 保存表格
df.to_csv(r'E:\Pycharm_Python\course\demo.csv')
'''hour x y z
area
9 18 1.453873 -0.452853 0.126672
5 20 -0.541874 -0.798552 0.209252
9 12 0.848762 -0.734806 0.124415
1 13 0.794053 1.838139 -0.268814
8 2 -0.115496 2.054565 0.860301
... ... ... ... ...
9 21 -0.212381 0.355993 -1.124492
1 20 -0.010173 0.408953 -0.275197
2 15 0.334253 0.231890 3.557654
0 3 -0.383228 -0.562431 2.418784
8 12 -1.004758 -0.539583 1.589166[1000 rows x 4 columns]
'''
3.1. 生成透视表
# 读取表格
df = pd.read_csv(r'E:\Pycharm_Python\course\demo.csv', index_col=0)# 设置透视范围
pd.set_option('display.max_columns', 4)
pd.set_option('display.max_rows', 10)# 生成透视表:将缺失值填充为0,并显示各列总和
pt = pd.pivot_table(df, index=['area', 'hour'], values=['x', 'y'], aggfunc=['sum', 'mean'], fill_value=0, margins=True)
'''sum mean x y x y
area hour
0 0 4.372290 0.019988 1.093072 0.0049971 -5.463018 3.510755 -1.092604 0.7021512 0.429444 -2.022444 0.429444 -2.0224443 1.954055 -1.683926 0.488514 -0.4209814 -2.226930 -3.827011 -1.113465 -1.913506
... ... ... ... ...
9 20 -1.422801 0.262971 -0.237134 0.04382921 -2.720063 1.411410 -0.544013 0.28228222 -0.342656 -0.502878 -0.171328 -0.25143923 -1.024892 -0.385198 -0.170815 -0.064200
All -24.847056 19.244009 -0.024847 0.019244[239 rows x 4 columns]
'''# 字典指定各标签的聚合函数
pt = pd.pivot_table(df, index=['area', 'hour'], aggfunc={'x': 'sum', 'y': 'mean'})
'''x y
area hour
0 0 4.372290 0.0049971 -5.463018 0.7021512 0.429444 -2.0224443 1.954055 -0.4209814 -2.226930 -1.913506
... ... ...
9 19 1.744798 -0.40582120 -1.422801 0.04382921 -2.720063 0.28228222 -0.342656 -0.25143923 -1.024892 -0.064200[238 rows x 2 columns]
'''
4. 数据重塑
4.1. 层次化索引
4.1.1. 双层索引的Series
import pandas as pd
import numpy as np# 双层索引
index = pd.MultiIndex.from_arrays([list('aaabbccdd'), list(map(int, '123121212'))], names=('area', 'numbers'))
'''MultiIndex([('a', '1'),('a', '2'),('a', '3'),('b', '1'),('b', '2'),('c', '1'),('c', '2'),('d', '1'),('d', '2')],names=['area', 'numbers'])
'''# 初始化
s = pd.Series(np.random.randn(9), index=index)
print(s)
'''
area numbers
a 1 0.4173282 0.1680573 1.252186
b 1 -1.8354902 0.951358
c 1 -1.9037622 -0.075067
d 1 0.7821232 0.355078
dtype: float64
'''# 单个选中
print(s['a', 1]) # 0.417328381875337# 单层选中
print(s['a'])
'''
numbers
1 0.417328
2 0.168057
3 1.252186
dtype: float64
'''# 单层切片
print(s['a':'b'])
'''
area numbers
a 1 0.4173282 0.1680573 1.252186
b 1 -1.8354902 0.951358
dtype: float64
'''print(s[:, 2])
'''
area
a 0.168057
b 0.951358
c -0.075067
d 0.355078
dtype: float64
'''
4.1.2. 双层索引的Dataframe
# 设置显示上限
pd.set_option('display.max_columns', 4)
pd.set_option('display.max_rows', 8)# 双层标签
index = pd.MultiIndex.from_arrays([list('aabbccdd'), list(map(int, '12121212'))], names=('area', 'numbers'))
columns = pd.MultiIndex.from_tuples([('t1', 'x'), ('t1', 'y'), ('t2', 'x'), ('t2', 'y')])
df = pd.DataFrame(np.random.randn(8, 4), index=index, columns=columns)
'''t1 t2 x y x y
area numbers
a 1 -0.125867 -1.722040 -0.266579 0.9100842 0.060483 0.750894 -0.479338 0.608312
b 1 0.345995 1.470237 1.763323 -0.3364752 -1.977062 0.071204 0.000797 -0.323753
c 1 0.963804 0.186688 0.443276 0.6156502 1.729371 -0.775489 1.663172 -0.657688
d 1 0.376276 0.693671 0.982811 -0.3938402 -0.632945 -2.046240 0.865305 1.150940
'''# 单值选中
print(df.loc[('a', 1), ('t1', 'x')]) # -0.12586716795606423# 单层行选中
print(df.loc['a'])
'''t1 t2 x y x y
numbers
1 -0.125867 -1.722040 -0.266579 0.910084
2 0.060483 0.750894 -0.479338 0.608312
'''# 单层列选中
print(df['t1'])
'''x y
area numbers
a 1 -0.125867 -1.7220402 0.060483 0.750894
b 1 0.345995 1.4702372 -1.977062 0.071204
c 1 0.963804 0.1866882 1.729371 -0.775489
d 1 0.376276 0.6936712 -0.632945 -2.046240
'''# 索引交换
df = df.swaplevel('area', 'numbers')
'''t1 t2 x y x y
numbers area
1 a -0.125867 -1.722040 -0.266579 0.910084
2 a 0.060483 0.750894 -0.479338 0.608312
1 b 0.345995 1.470237 1.763323 -0.336475
2 b -1.977062 0.071204 0.000797 -0.323753
1 c 0.963804 0.186688 0.443276 0.615650
2 c 1.729371 -0.775489 1.663172 -0.657688
1 d 0.376276 0.693671 0.982811 -0.393840
2 d -0.632945 -2.046240 0.865305 1.150940
'''
4.2. 离散化处理
4.2.1. 分组运算
# 设置显示上限
pd.set_option('display.max_rows', 6)# 读取表格
df = pd.read_csv(r'E:\Pycharm_Python\course\demo.csv', index_col=0)
'''hour x y z
area
9 18 1.453873 -0.452853 0.126672
5 20 -0.541874 -0.798552 0.209252
9 12 0.848762 -0.734806 0.124415
... ... ... ... ...
2 15 0.334253 0.231890 3.557654
0 3 -0.383228 -0.562431 2.418784
8 12 -1.004758 -0.539583 1.589166[1000 rows x 4 columns]
'''# 对表格按索引和标签分组运算
print(df.groupby([df.index, df['hour']]).mean())
'''x y z
area hour
0 0 1.093072 0.004997 -0.1831011 -1.092604 0.702151 -0.5567972 0.429444 -2.022444 -0.346545
... ... ... ...
9 21 -0.544013 0.282282 -0.19125022 -0.171328 -0.251439 -0.02212123 -0.170815 -0.064200 -0.244528[238 rows x 3 columns]
'''# 对某列按索引分组运算
print(df['x'].groupby(df.index).sum())
'''
area
0 -10.897082
1 -4.915652
2 -13.841750...
7 -4.954806
8 -6.258694
9 2.828964
Name: x, Length: 10, dtype: float64
'''
4.2.2. 分级标签
# 设置显示上限
pd.set_option('display.max_rows', 6)# 读取表格
df = pd.read_csv(r'E:\Pycharm_Python\course\demo.csv', index_col=0)
'''hour x y z
area
9 18 1.453873 -0.452853 0.126672
5 20 -0.541874 -0.798552 0.209252
9 12 0.848762 -0.734806 0.124415
... ... ... ... ...
2 15 0.334253 0.231890 3.557654
0 3 -0.383228 -0.562431 2.418784
8 12 -1.004758 -0.539583 1.589166[1000 rows x 4 columns]
'''# 按数值区间分级
bins = [0, 0.1, 0.4, 0.8, 1.6, 3.2, 4.0]
labels = ['E', 'D', 'C', 'B', 'A', 'S']
df['rank_x'] = pd.cut(df['x'].abs(), bins, labels=labels)
'''hour x y z rank_x
area
9 18 1.453873 -0.452853 0.126672 B
5 20 -0.541874 -0.798552 0.209252 C
9 12 0.848762 -0.734806 0.124415 B
... ... ... ... ... ...
2 15 0.334253 0.231890 3.557654 D
0 3 -0.383228 -0.562431 2.418784 D
8 12 -1.004758 -0.539583 1.589166 B[1000 rows x 5 columns]
'''# 按分位区间分级
bins = np.percentile(df['x'], [0, 25, 50, 70, 85, 95, 100])
labels = ['E', 'D', 'C', 'B', 'A', 'S']
df['rank_x'] = pd.cut(df['x'].abs(), bins, labels=labels)
print(df)
'''hour x y z rank_x
area
9 18 1.453873 -0.452853 0.126672 A
5 20 -0.541874 -0.798552 0.209252 B
9 12 0.848762 -0.734806 0.124415 B
... ... ... ... ... ...
2 15 0.334253 0.231890 3.557654 C
0 3 -0.383228 -0.562431 2.418784 C
8 12 -1.004758 -0.539583 1.589166 A[1000 rows x 5 columns]
'''
4.3. 数据集合并
# 设置显示上限
pd.set_option('display.max_rows', 6)# 读取表格
df = pd.read_csv(r'E:\Pycharm_Python\course\demo.csv', index_col=0)
'''hour x y z
area
9 18 1.453873 -0.452853 0.126672
5 20 -0.541874 -0.798552 0.209252
9 12 0.848762 -0.734806 0.124415
... ... ... ... ...
2 15 0.334253 0.231890 3.557654
0 3 -0.383228 -0.562431 2.418784
8 12 -1.004758 -0.539583 1.589166[1000 rows x 4 columns]
'''# 单表添加和多表拼接
print(df.iloc[:3]._append(df.iloc[3:6]))
print(pd.concat([df.iloc[:2], df.iloc[2:4], df.iloc[4:6]], axis=0))
'''hour x y z
area
9 18 1.453873 -0.452853 0.126672
5 20 -0.541874 -0.798552 0.209252
9 12 0.848762 -0.734806 0.124415
1 13 0.794053 1.838139 -0.268814
8 2 -0.115496 2.054565 0.860301
9 9 1.235167 1.030952 -0.517618
'''# 合并
'''样表'''
df1 = df.iloc[2:5][['x', 'y']]
'''hour x y
area
9 12 0.848762 -0.734806
1 13 0.794053 1.838139
8 2 -0.115496 2.054565
'''df2 = df.iloc[2:5][['x', 'z']].sample(frac=1)
'''hour x z
area
8 2 -0.115496 0.860301
1 13 0.794053 -0.268814
9 12 0.848762 0.124415
'''print(pd.merge(df1, df2, on='area'))
'''x_x y x_y z
area
9 0.848762 -0.734806 0.848762 0.124415
1 0.794053 1.838139 0.794053 -0.268814
8 -0.115496 2.054565 -0.115496 0.860301
'''
相关文章:
【数据分析(二)】初探 Pandas
目录 引言1. 基本数据结构1.1. Series 的初始化和简单操作1.2. DataFrame 的初始化和简单操作1.2.1. 初始化与持久化1.2.2. 读取查看1.2.3. 行操作1.2.4. 列操作1.2.5. 选中筛查 2. 数据预处理2.0. 生成样例表2.1. 缺失值处理2.2. 类型转换和排序2.3. 统计分析 3. 数据透视3.0.…...
第9章:Python TDD解决货币对象相等性比较难题
写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…...
更新布局元素的属性
每个布局元素都有一组可以通过编程来更新的属性.布局元素有很多种不同的类型,如图例,图形,文本,地图整饰等等. 操作方法: 1.打开目标活动地图文档 2.打开python窗口 3.导入arcpy模块 import arcpy.mapping as mapping 4.引用当前活动地图文档,把该引用赋值给变量 mxd map…...
UDP協議與代理IP介紹
UDP,全稱是用戶數據報協議(User Datagram Protocol),是Internet協議套組的一部分,與TCP協議一道工作。與TCP相比,UDP可以理解為一個更“羽量級”的協議。它不需要像TCP那樣在數據傳輸開始之前建立連接&…...

QT 中 UDP 的使用
目录 一、UDP 简介 二、QT 中 UDP 编程的基本步骤 (一)包含头文件 (二)创建 UDP 套接字对象 (三)绑定端口 (四)发送数据 (五)接收数据 三、完整示例代…...

leetcode刷题记录(七十二)——146. LRU 缓存
(一)问题描述 146. LRU 缓存 - 力扣(LeetCode)146. LRU 缓存 - 请你设计并实现一个满足 LRU (最近最少使用) 缓存 [https://baike.baidu.com/item/LRU] 约束的数据结构。实现 LRUCache 类: * LRUCache(int capacity)…...

深圳大学-计算机系统(3)-实验一MIPS指令集实验
实验目标 a) 了解WinMIPS64的基本功能和作用; b) 熟悉MIPS指令、初步建立指令流水执行的感性认识; c) 掌握该工具的基本命令和操作,为流水线实验作准备。 实验内容 按照下面的实验步骤及说明,完成相关操作记录实验过程的截图&a…...

Java面试专题——面向对象
面向过程和面向对象的区别 面向过程:当事件比较简单的时候,利用面向过程,注重的是事件的具体的步骤/过程,注重的是过程中的具体的行为,以函数为最小单位,考虑怎么做。 面向对象:注重找“参与者…...

知行合一:解决有心无力的问题,解决知易行难的问题,知行合一并不意味着事事都要合一,而是....
问题是什么? 想学习的时候,有手机阻碍我们。想戒掉手机短视频,卸载后,几天的时间,又下载了回来。制定了减肥计划,但就是不执行。明知道这样做是不对的,但依然行动不起来。 沉溺于各种各样的享…...

Qt中自定义信号与槽
在学习信号和槽的时候,我们知道信号一般对应的就是用户的行为,槽指的是接受到信号后的响应,在类内有许多的内置信号和槽函数,能够去实现一些常见的行为,但实际业务开发中,尤其是接受到信号的响应会根据具体…...
.NET 8 项目 Docker 方式部署到 Linux 系统详细操作步骤
本文将详细介绍如何将一个 .NET 8 项目通过 Docker 部署到 Linux 系统中。以下步骤包括从项目的创建、Dockerfile 的编写、镜像构建、到最后在 Linux 上的容器运行。 1. 环境准备 在开始之前,请确保你已经具备以下环境: Linux 系统(如 Ubu…...
深入了解 Java split() 方法:分割字符串的利器
Java 提供的 split() 方法是 String 类中一个常用的工具,它可以将一个字符串根据指定的分隔符切割成多个子字符串,并以字符串数组的形式返回。这个方法常用于字符串的处理、数据解析等场景。本文将详细介绍 Java 中 split() 方法的使用方式,并…...
pgsql中处理数组类型字段
1、代码中存入和读取 需要使用自定义转换器 Slf4j public class ArrayTypeHandler extends BaseTypeHandler<List<String>> {Overridepublic void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType)throws SQL…...
如何正确定位前后端bug?
在平时的开发过程中,正确定位前后端bug是提高开发效率和项目质量的关键。以下是一些实用的方法。 一、前后端bug 特征 前端主要负责显示数据,后端主要负责处理数据、存储数据,前后端主要通过接口进行数据交换。 1.前端bug特征 界面显示类…...

mfc操作json示例
首先下载cJSON,加入项目; 构建工程,如果出现, fatal error C1010: unexpected end of file while looking for precompiled head 在cJSON.c文件的头部加入#include "stdafx.h"; 看情况,可能是加到.h或者是.cpp文件的头部,它如果有包含头文件, #include &…...

【技术总结类】2024,一场关于海量数据治理以及合理建模的系列写作
目录 1.今年的创作路线 2.先说第一条线 2.1.由日志引出的海量文本数据存储和分析问题 2.2.监控以及监控的可视化 2.3.数据量级再往上走牵扯出了大数据 2.4.由大数据牵扯出的JAVA线程高级内容 3.第二条线,也是2025要继续的主线 1.今年的创作路线 今年的写作内…...

Dockerfile另一种使用普通用户启动的方式
基础镜像的Dockerfile # 使用 Debian 11.9 的最小化版本作为基础镜像 FROM debian:11.11# 维护者信息 LABEL maintainer"caibingsen" # 复制自定义的 sources.list 文件(如果有的话) COPY sources.list /etc/apt/sources.list # 创建…...
python的pushbullet库在设备之间发送通知链接文件
Pushbullet 是一个非常方便的 Python 库,可以帮助你在设备之间发送通知、链接、文件等。以下是 Pushbullet 的一些主要功能和使用方法: 功能 与你的 Pushbullet 账户关联的设备(需要下载对应的pushbullet手机APP、电脑客户端)之…...

STM32之FreeRTOS开发介绍(十九)
STM32F407 系列文章 - freertos(十九) 目录 前言 一、简述 二、开源网址 三、原理及功能特性 1.原理简介 2.功能介绍 1.任务调度 2.任务管理 3.中断管理 4.消息队列 3.特点说明 4.优缺点 四、参考书籍 五、实现方式 总结 前言 FreeRTOS是…...

用java配合redis 在springboot上实现令牌桶算法
令牌桶算法配合 Redis 在 Java 中的应用令牌桶算法是一种常用的限流算法,适用于控制请求的频率,防止系统过载。结合 Redis 使用可以实现高效的分布式限流。 一.、引入依赖首先,需要在 pom.xml 文件中引入 spring-boot-starter-data-re…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...