当前位置: 首页 > news >正文

【数据分析(二)】初探 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中的arrayPython中的基本数据结构list类似,是一种能保存不同数据类型一维数组

s = pd.Series(data, index, dtype, name, copy)

  • data类数组array-like或者字典dict。类数组的索引(自然数序列)作为Series索引s.index,元素作为Seriess.values;字典的键作为s.index,值作为s.values
  • index类数组array-like重新指定s.index,若dataarray-like,则依序匹配;若datadict,则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?

在平时的开发过程中&#xff0c;正确定位前后端bug是提高开发效率和项目质量的关键。以下是一些实用的方法。 一、前后端bug 特征 前端主要负责显示数据&#xff0c;后端主要负责处理数据、存储数据&#xff0c;前后端主要通过接口进行数据交换。 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.第二条线&#xff0c;也是2025要继续的主线 1.今年的创作路线 今年的写作内…...

Dockerfile另一种使用普通用户启动的方式

基础镜像的Dockerfile # 使用 Debian 11.9 的最小化版本作为基础镜像 FROM debian:11.11# 维护者信息 LABEL maintainer"caibingsen" # 复制自定义的 sources.list 文件&#xff08;如果有的话&#xff09; COPY sources.list /etc/apt/sources.list # 创建…...

python的pushbullet库在设备之间发送通知链接文件

Pushbullet 是一个非常方便的 Python 库&#xff0c;可以帮助你在设备之间发送通知、链接、文件等。以下是 Pushbullet 的一些主要功能和使用方法&#xff1a; 功能 与你的 Pushbullet 账户关联的设备&#xff08;需要下载对应的pushbullet手机APP、电脑客户端&#xff09;之…...

STM32之FreeRTOS开发介绍(十九)

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

用java配合redis 在springboot上实现令牌桶算法

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

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...