Python数据处理:Pandas 学习笔记

python学习笔记二(pandas基础) 大写的吐槽:暑假提前结束,实验室项目越来越紧,略烦躁(不喜欢做的项目),没啥自由学习的时间了。只有抽些零散的时间去准备数据挖掘比赛相关的东西。最近关注的大神 wepon,bryan的博客,干货多多! PS: 实验室师兄们找工作也是压力山大,祝他们好运!今天继续pandas基础学习,参考资料还是来自以下网址,练习数据换成自己的,加深印象: http://www.open-open.com/lib 阅读详情

Python数据处理:IPython使用学习笔记
Python数据处理:Numpy 学习笔记
Python数据处理:Pandas 学习笔记


一. pandas

1. 介绍

pandas是建立在Numpy基础上的高效数据分析处理库
主要包括:

  • Series 一维带标签的同种类型的数组
  • DataFrame 二维代表前的大小可变的各种数据类型可以不同的二维表格
  • Panel 三维带标签的大小可变的数据

数据呈直线排列,并且数据和数据标签在默认情况下是相互对齐的

2. pandas引用
import pandas as pd
from pandas import Series, DataFrame
import numpy as np

二. Series

1. 创建Series序列
s = pd.Series(np.random.rand(5))	# 通过np创建Series
''' 左侧的是索引值
0    0.048789
1    0.068063
2    0.103401
3    0.136115
4    0.166982
dtype: float64
'''

### 可以用list作为索引,创建序列
index_2 = ['a','b','c','d','e']
s2 = pd.Series(np.random.randint(1,6,(5,)),index=index_2)
'''
a    3
b    2
c    5
d    2
e    5
dtype: int32
'''

### 用字典格式,则key为序列
dict_a = {'m':2, 'n':1, 'o':5, 'p':2}
s3 = Series(dict_a)
'''
m    2
n    1
o    5
p    2
dtype: int64
'''

s4 = Series(dict_a, ['o','m','q','p'])      # 也可再指定序列,其中值从dict[key]中取,取不到则为NaN
'''
o    5.0
m    2.0
q    NaN
p    2.0
dtype: float64
'''
2. Series属性
s.index             # 得到索引,RangeIndex(start=0, stop=5, step=1)
s.values            # 得到值,array([ 0.0487887 ,  0.0680634 ,  0.10340053,  0.13611469,  0.16698198])
3. 序列取值与赋值
### 序列取值
s4['m']             # 2.0
s4[['m','o']]
'''
m    2.0
o    5.0
dtype: float64
'''
s4['q'] = 1         # 赋值
'q' in s4           # 判断'q'是否在s4的索引中 True
'a' in s4           # False
s4.get('q')
4. 序列分片
### 序列分片
s[1:3]
'''
1    0.068063
2    0.103401
dtype: float64
'''
5. 序列判断与计算
s4[s4>3]                # 有些像np的布尔索引
s4[s4==2] = 4           # 修改其中2的值,为4

s4 * 2                  # 乘法,作用于每个数上,与np乘法相同
'''
o    10.0
m     4.0
q     2.0
p     4.0
dtype: float64
'''

np.sin(s4)              # np的方法也能用在Series上
'''
o   -0.958924
m    0.909297
q    0.841471
p    0.909297
dtype: float64
'''
  • 序列和数组的一个重要的不同点: 不同序列之间进行运算时,相同索引位置会自动对齐,并进行运算
### 特殊点
s4[1::] + s4[::-1]

''' 
        s4[1::]       +      s4[::-1]       ==          ?
        m    2.0            p    2.0                m    4.0
        q    1.0            q    1.0                o    NaN
        p    2.0            m    2.0                p    4.0
                            o    5.0                q    2.0
                            
    可以看到,两个Series相加,并没有按顺序,而是自动合并了相同的索引位置的值,做加法
    这很重要,这一特性是pandas区别于大多数数据处理工具的重要特性
'''

三. DataFrame

1. 创建DF

### 初始化:用字典dict()
data = {'姓名':['李白','辛弃疾','杜甫','苏轼','孟浩然','韩愈'],
        '年龄':[11,12,13,14,15,16],
        '语文':[97,90,92,94,88,86],
        '数学':[71,91,84,66,72,74],
        '物理':[53,82,70,73,81,70],
        '生物':[78,62,83,72,55,50]
        }
df = DataFrame(data)
'''     字典的键成为column列标签,行标签自动生成从0开始的自增序列
    姓名  年龄  数学  物理  生物  语文
0   李白  34  71  53  78  97
1  辛弃疾  11  91  82  62  90
2   杜甫  73  84  70  83  92
3   苏轼  41  66  73  72  94
4  孟浩然  99  72  81  55  88
5   韩愈  82  74  70  50  86
'''

# 通过columns和index指定标签、列名和顺序
df2 = DataFrame(data, columns=['姓名','数学','语文','物理','生物','年龄'],
                index=['a','b','c','d','e','f'])
'''
    姓名  数学  语文  物理  生物  年龄
a   李白  71  97  53  78  34
b  辛弃疾  91  90  82  62  11
c   杜甫  84  92  70  83  73
d   苏轼  66  94  73  72  41
e  孟浩然  72  88  81  55  99
f   韩愈  74  86  70  50  82
'''

### 初始化:用Series
data3 = {'姓名':Series(['李白','辛弃疾','杜甫','苏轼','孟浩然','韩愈'],
                     index = ['a','b','c','d','e','f']),
        '年龄':Series([11,12,13,14,15,16], index = ['a','f','b','c','d','e']),
        '诗词':Series([0,0,1,1,1,1], index = ['f','e','a','b','c','d'])
        }
df3 = DataFrame(data3)          # 注意这里合并时,并不是用顺序,而是用index自动合并
'''
    姓名  年龄  诗词
a   李白  11   1
b  辛弃疾  13   1
c   杜甫  14   1
d   苏轼  15   1
e  孟浩然  16   0
f   韩愈  12   0
'''
2. 属性
### 属性
df2.index       # index索引对象,索引对象不允许修改 df2.index = [1,2,3,4,5,6]会报错
df2.columns     # columns
df2.values      # 数据 类型type=np.ndarray

df2.head(5)     # 前5行数据
df2.tail(3)     # 后3行数据
df2.reindex(['f','e','aa'])      # 用reindex来返回新df,从原数据找出对应索引的值,不存在则用NaN。可以通过fill_value、method等参数设置默认值或取值方法
'''
     姓名    数学    语文    物理    生物    年龄
f    韩愈  74.0  86.0  70.0  50.0  82.0
e   孟浩然  72.0  88.0  81.0  55.0  99.0
aa  NaN   NaN   NaN   NaN   NaN   NaN
'''
3. 切片或取值
a. 列操作
## a. 取指定column列
# 方法一:传统取法,可以传入某column名称,来取对应的列
df2['姓名']
''' type是Series
a     李白
b    辛弃疾
c     杜甫
d     苏轼
e    孟浩然
f     韩愈
Name: 姓名, dtype: object
'''

## 方法二:像调用属性和方法一样,直接使用   .column取
df2.年龄
'''
a    34
b    11
c    73
d    41
e    99
f    82
Name: 年龄, dtype: int64
'''
## b. 列切片 可以传入多个column名称,来取对应的列,或者重新排序
df2[['姓名','年龄']]
''' type是DataFrame
    姓名  年龄
a   李白  34
b  辛弃疾  11
c   杜甫  73
d   苏轼  41
e  孟浩然  99
f   韩愈  82
'''
b. 行操作
## a.取特定行
df2.loc['a']
''' type是Series
姓名    李白
数学    71
语文    97
物理    53
生物    78
年龄    34
Name: a, dtype: object
'''

# 要注意不能用df[特定行index],这个规定决定了下面两种取值方式都会报错
# df2[['a']]      df2['a']
## b.多行切片
# 方法一:loc[行范围]   此时行范围不能是list或者特定值
df2.loc[['a','b']]
''' type是DataFrame
    姓名  数学  语文  物理  生物  年龄
a   李白  71  97  53  78  34
b  辛弃疾  91  90  82  62  11
'''

## 方法二:数组方式切片
df2[1:3]                # 可以用数字范围,说明index是有顺序的
'''
    姓名  数学  语文  物理  生物  年龄
b  辛弃疾  91  90  82  62  11
c   杜甫  84  92  70  83  73
'''

df2['a':'d']            # 也可以用index本身的名称
''' 包含d行,居然没有去除
    姓名  数学  语文  物理  生物  年龄
a   李白  71  97  53  78  34
b  辛弃疾  91  90  82  62  11
c   杜甫  84  92  70  83  73
d   苏轼  66  94  73  72  41
'''

# 但不能用list,如:df2[['a','d']]   会报错

c. 行列同时切片
## a.方法一:df.loc[行index范围, 列column范围]
df2.loc[['a','b'],['年龄','姓名']]         # index 可以是list
'''
   年龄   姓名
a  34   李白
b  11  辛弃疾
'''

df2.loc['a':'c',['年龄','姓名']]           # index 可以是范围
'''
   年龄   姓名
a  34   李白
b  11  辛弃疾
c  73   杜甫
'''

df2.loc['a',['年龄','姓名']]                # index 可以是特定值
'''
   年龄  姓名
a  34  李白
c  73  杜甫
'''
## b. 方法二:df[列column范围][行index范围] 或者:df[行index范围][列column范围](此时index不能为特定行)
df2[['姓名','年龄','生物']]['a':'d']
'''
    姓名  年龄  生物
a   李白  34  78
b  辛弃疾  11  62
c   杜甫  73  83
d   苏轼  41  72
'''

df2['姓名']['a':'d']          # column 为单一值
'''
a     李白
b    辛弃疾
c     杜甫
d     苏轼
Name: 姓名, dtype: object
'''


# 也可以颠倒,但index放前面时,不允许index为list或者特定项
df2['a':'d'][['姓名','年龄','生物']]
'''
    姓名  年龄  生物
a   李白  34  78
b  辛弃疾  11  62
c   杜甫  73  83
d   苏轼  41  72
'''

df2['a':'d']['姓名']
'''
a     李白
b    辛弃疾
c     杜甫
d     苏轼
Name: 姓名, dtype: object
'''

# 下面两种都会报错
#df2[['a','b']][['姓名','年龄','生物']]
#df2['a'][['姓名','年龄','生物']]

## 同时,直接取法也不允许像loc那么写:df2['a':'d','姓名']
d. 取特定坐标的值
## a.loc[index坐标,column坐标]
df2.loc['a','年龄']           # 取特定的值 本例:34  type=int

## b.df[column坐标][index坐标]  与loc相反,因为[index坐标]如果放前,不能为特定值
df2['年龄']['a']

e. 通过位置进行切片
df.iloc[1:3,0:3]        # 用位置切片
'''
    姓名  年龄  数学
1  辛弃疾  11  91
2   杜甫  73  84
'''

df.iloc[:,::2]          # 隔列切片
'''
    姓名  数学  生物
0   李白  71  78
1  辛弃疾  91  62
2   杜甫  84  83
3   苏轼  66  72
4  孟浩然  72  55
5   韩愈  74  50
'''

df.iloc[1,0]            # 取值,'辛弃疾'

'这里需要留意:

  • 对loc/iloc函数来说,始终都是loc(行,列),无论取值或者切片,都是最稳妥的方式(非常推荐)
  • 但对坐标法df[]取值:
a. df[列]为主要取列方式(取列时推荐)
b. 坐标法想要作用在行上,唯有当df[index_start:index_end]这种表示法,才正常;传单个行或者list都会错(不推荐坐标法取行,容易写错)
c. 这种方法取特定值,则只能用df[列][行] (不太推荐,容易写反,能记住也可以用)
4. 增加、删除列(都是对原数据进行了修改)
# 方法一:指定某一数
df2['化学'] = 60                      # 指定某一数
''' 增加了一列:化学
    姓名  数学  语文  物理  生物  年龄  化学
a   李白  71  97  53  78  34  60
b  辛弃疾  91  90  82  62  11  60
c   杜甫  84  92  70  83  73  60
d   苏轼  66  94  73  72  41  60
e  孟浩然  72  88  81  55  99  60
f   韩愈  74  86  70  50  82  60
'''

# 方法二:指定一个list
df2['化学'] = [70,60,50,40,30,20]     # 也可以直接用list

# 方法三:用insert方法
df2.insert(4, '化学',np.array([70,60,50,40,30,20]))       # 用insert指定插入位置
'''
    姓名  数学  语文  物理  化学  生物  年龄
a   李白  71  97  53  70  78  34
b  辛弃疾  91  90  82  60  62  11
c   杜甫  84  92  70  50  83  73
d   苏轼  66  94  73  40  72  41
e  孟浩然  72  88  81  30  55  99
f   韩愈  74  86  70  20  50  82
'''

删除

## 删除
# 方法一:del
del df2['化学']
'''
    姓名  数学  语文  物理  生物  年龄
a   李白  71  97  53  78  34
b  辛弃疾  91  90  82  62  11
c   杜甫  84  92  70  83  73
d   苏轼  66  94  73  72  41
e  孟浩然  72  88  81  55  99
f   韩愈  74  86  70  50  82
'''

# 方法二: pop()
chemic = df2.pop('化学')

# 方法三:drop
df2.drop('生物',axis=1)

5. 增加删除行
### 增加行
df2.loc['g'] = ['白居易', 83, 58, 91, 71, 70]
'''
    姓名  数学  语文  物理  生物  年龄
a   李白  71  97  53  78  34
b  辛弃疾  91  90  82  62  11
c   杜甫  84  92  70  83  73
d   苏轼  66  94  73  72  41
e  孟浩然  72  88  81  55  99
f   韩愈  74  86  70  50  82
g  白居易  83  58  91  71  70
'''

# 删除行
df2.drop('g',inplace=True)

5. 运算对齐特性
### 结果为:相同行列索引的值进行运算的结果交集
data_a = DataFrame(np.arange(12).reshape(3,4),columns=['a','b','c','d'], index= range(1,4))
'''
   a  b   c   d
1  0  1   2   3
2  4  5   6   7
3  8  9  10  11
'''

data_b = DataFrame(np.random.randint(0,6,(3,4)),columns=['a','b','c','e'], index= range(2,5))
'''
   a  b  c  e
2  4  2  2  0
3  5  5  0  1
4  5  4  4  1
'''

计算时,pandas会自动对齐,相同坐标的数进行计算

r = data_a + data_b
''' 相同位置的数,相加,否则为NaN
      a     b     c   d   e
1   NaN   NaN   NaN NaN NaN
2   8.0   7.0   8.0 NaN NaN
3  13.0  14.0  10.0 NaN NaN
4   NaN   NaN   NaN NaN NaN
'''

扩充转换机制

### pandas有与numpy相同的扩充转换机制
data_b - data_b.loc[2]
'''  可以看到不只是第一行,下面每一行都减了第一行的数据,说明进行了扩充转换
   a  b  c  e
2  0  0  0  0
3  1  3 -2  1
4  1  2  2  1
'''
6. pandas空值问题
### 预备知识
None == None            # 为True
np.nan == np.nan        # 为False
np.nan is np.nan        # 为True
"""pandas空值问题"""
### 在pandas中,None和np.nan都是空值
test = DataFrame(np.array([[None,np.nan,1],[2,None,np.nan]]),columns=list('abc'),index=range(2))
''' 
      a     b    c
0  None   NaN    1
1     2  None  NaN
'''

test.loc[0] == np.nan   # 这样判断出来的结果都为False
'''
a    False
b    False
c    False
'''

fillna() 填充空值

### fillna()可以实现空值填充功能
test.fillna(3)
''' 所有NaN和None都被填充了3
   a  b  c
0  3  3  1
1  2  3  3
'''

### fillna() 更高级用法
r.loc[5] = r.loc[1]    # 增加一行,值同第一行
r.loc[6] = [np.random.randint(0,6) for i in range(5)]
''' 创造备用数据
      a     b     c    d    e
1   NaN   NaN   NaN  NaN  NaN
2   8.0   7.0   8.0  NaN  NaN
3  13.0  14.0  10.0  NaN  NaN
4   NaN   NaN   NaN  NaN  NaN
5   NaN   NaN   NaN  NaN  NaN
6   4.0   1.0   2.0  3.0  1.0
'''

r.fillna(method='pad',limit=1)      # pad 用Nan上一行的数据,来填充这个NaN的内容
'''
      a     b     c    d    e
1   NaN   NaN   NaN  NaN  NaN
2   8.0   7.0   8.0  NaN  NaN
3  13.0  14.0  10.0  NaN  NaN
4  13.0  14.0  10.0  NaN  NaN
5   NaN   NaN   NaN  NaN  NaN
6   4.0   1.0   2.0  3.0  1.0
'''

r.dropna()              # 丢弃有空值的行或
'''
     a    b    c    d    e
6  4.0  1.0  2.0  3.0  1.0
'''
7. 多级索引
a. 创建多级索引
'''多级索引'''
arrays = [['一班','一班','一班','二班','二班'],['李白','杜甫','白居易','苏轼','李白']]
tuples = list(zip(*arrays))

index = pd.Index(tuples, name=["班级","老师"])      # 创建了多级索引index
'''
MultiIndex(levels=[['一班', '二班'], ['李白', '杜甫', '白居易', '苏轼']],
           labels=[[0, 0, 0, 1, 1], [0, 1, 2, 3, 0]],
           names=['班级', '老师'])
'''

# 创建多维索引数组,每个老师每年每班合格学生数
multi_data = DataFrame(np.random.randint(30,50,(5,3)),columns=[2016,2017,2018],index = index)   
''' 这里是多级索引的DataFrame,注意column是分行的
        2016  2017  2018
班级 老师                   
一班 李白     40    46    48
   杜甫     32    35    46
   白居易    48    45    47
二班 苏轼     33    37    33
   李白     31    31    43
'''

multi_data.T        # 可以转置,这样columns是多维索引
'''
班级    一班          二班    
老师    李白  杜甫 白居易  苏轼  李白
2016  40  32  48  33  31
2017  46  35  45  37  31
2018  48  46  47  33  43
'''

# 也可以直接创建列的多维索引
t_multi_data = DataFrame(multi_data.values.transpose(),index=[2016,2017,2018],columns = index)
b.多维索引取数
### 多维索引取数
multi_data[2016]['一班','李白']             # 40
multi_data.loc[('一班','李白'),2016]        # 40
multi_data.iloc[0,0]                        # 40

t_multi_data['一班','李白'][2016]           # 40
t_multi_data.loc[2016,('一班','李白')]      # 40
t_multi_data.iloc[0,0]                      # 40

c. 多级索引数组切片
# 多级索引数组切片
multi_data.loc['一班']            # 能单独取某个维度的index
'''
     2016  2017  2018
老师                   
李白     40    46    48
杜甫     32    35    46
白居易    48    45    47
'''
# multi_data.loc['李白']  只取李白不能生效,可以用swaplevel()切换索引后,再进行筛选

multi_data.loc['一班', '杜甫']      # 与 multi_data.loc[('一班', '杜甫')]相同
'''
2016    32
2017    35
2018    46
Name: (一班, 杜甫), dtype: int32
'''
d.多级索引数组变换
### 交换索引
multi_data.swaplevel()
'''
        2016  2017  2018
老师  班级                  
李白  一班    40    46    48
杜甫  一班    32    35    46
白居易 一班    48    45    47
苏轼  二班    33    37    33
李白  二班    31    31    43
'''

### 舍弃index,转成普通DataFrame(groupby后就为MultiIndex格式数据,需要通过此步骤再转成df)
ordinary_data = multi_data.reset_index()        # 注意不是reindex()
'''
   班级   老师  2016  2017  2018
0  一班   李白    40    46    48
1  一班   杜甫    32    35    46
2  一班  白居易    48    45    47
3  二班   苏轼    33    37    33
4  二班   李白    31    31    43
'''
8. 组合数据
a. concat()
"""组合数据"""
### pd.concat
df1 = DataFrame(np.arange(12).reshape(3,4),columns=tuple('ABCD'))
'''
   A  B   C   D
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11
'''

df2 = DataFrame(np.random.choice(list("abcdefg"),12).reshape(3,4),columns=tuple('CDEF'),index=[i for i in range(2,5)])
'''
   C  D  E  F
2  g  g  e  b
3  a  e  d  d
4  e  f  d  c
'''

pd.concat([df1,df2])                # 相同column列会组合,无值则用NaN代替,但列上并不会合并,例如本例有两行index都为2
'''
     A    B   C   D    E    F
0  0.0  1.0   2   3  NaN  NaN
1  4.0  5.0   6   7  NaN  NaN
2  8.0  9.0  10  11  NaN  NaN
2  NaN  NaN   g   g    e    b
3  NaN  NaN   a   e    d    d
4  NaN  NaN   e   f    d    c
'''

pd.concat([df1,df2], axis=1)        # 横向组合,相同index行会组合,无值用NaN代替
'''
     A    B     C     D    C    D    E    F
0  0.0  1.0   2.0   3.0  NaN  NaN  NaN  NaN
1  4.0  5.0   6.0   7.0  NaN  NaN  NaN  NaN
2  8.0  9.0  10.0  11.0    g    g    e    b
3  NaN  NaN   NaN   NaN    a    e    d    d
4  NaN  NaN   NaN   NaN    e    f    d    c
'''

pd.concat([df1,df2], axis=1,join='inner')   # join为inner,只显示共有的index=2 的行
'''
   A  B   C   D  C  D  E  F
2  8  9  10  11  g  g  e  b
'''

pd.concat([df1,df2], join='inner')          # 列上共有的CD两列
'''
    C   D
0   2   3
1   6   7
2  10  11
2   g   g
3   a   e
4   e   f
'''
b. append
### append 附加,与concat在列上axis=0上叠加相似
df1.append(df2)
c. merge()
### merge() 与数据库非常相似
df1 = pd.DataFrame(np.arange(12).reshape(3,4),columns=list("ABCD"))
'''
   A  B   C   D
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11
'''
df2 = pd.DataFrame({'D':[3,11,6],'E':['a','e','b'],'C':[7,10,2]})
'''
    C   D  E
0   7   3  a
1  10  11  e
2   2   6  b
'''

pd.merge(df1,df2,on='D')            # 根据'D'列的数据进行合并
'''因为C在df1、df2中都有,所以会被改后缀
   A  B  C_x   D  C_y  E
0  0  1    2   3    7  a
1  8  9   10  11   10  e
'''

pd.merge(df1,df2,on='D',how='left')        # 左连接,右边匹配不到的补零
'''
   A  B  C_x   D   C_y    E
0  0  1    2   3   7.0    a
1  4  5    6   7   NaN  NaN
2  8  9   10  11  10.0    e
'''

pd.merge(df1,df2,on=['D','C'],how='outer')  # 以两列作为共选字段,进行匹配
'''
     A    B   C   D    E
0  0.0  1.0   2   3  NaN
1  4.0  5.0   6   7  NaN
2  8.0  9.0  10  11    e
3  NaN  NaN   7   3    a
4  NaN  NaN   2   6    b
'''
d. combine_first()
### combine_first() 合并
df1.loc[0].combine_first(df2.loc[0])
'''
A    0
B    1
C    2
D    3
E    a      # E在df1中不存在,则取df2的值
Name: 0, dtype: object
'''

9. groupby()分组
"""分组 groupby"""
df = multi_data.reset_index()           # 用之前df的一个例子
'''
   班级   老师  2016  2017  2018
0  一班   李白    40    46    48
1  一班   杜甫    32    35    46
2  一班  白居易    48    45    47
3  二班   苏轼    33    37    33
4  二班   李白    31    31    43
'''

### groupby分类,此时grouped是一个对象
grouped = df.groupby('班级')
## 进一步对groupby后的数据进行运算
grouped.sum()                       # 求和
'''   返回的是一个MultiIndex的对象
    2016  2017  2018
班级                  
一班   120   126   141
二班    64    68    76
'''

grouped.mean()                      # 求平均
'''
    2016  2017  2018
班级                  
一班    40    42    47
二班    32    34    38
'''

### 多个条件groupby,本质上没有先后顺序
df.groupby(['老师','班级']).sum()
'''
        2016  2017  2018
老师  班级                  
李白  一班    40    46    48
    二班    31    31    43
杜甫  一班    32    35    46
白居易 一班    48    45    47
苏轼  二班    33    37    33
'''

### groupby对象是个迭代器,可以循环查看
for (a,b), group in df.groupby(['老师','班级']):
    print(a,b)
    print(group)
'''
李白 一班
   班级  老师  2016  2017  2018
0  一班  李白    40    46    48
李白 二班
   班级  老师  2016  2017  2018
4  二班  李白    31    31    43
杜甫 一班
   班级  老师  2016  2017  2018
1  一班  杜甫    32    35    46
白居易 一班
   班级   老师  2016  2017  2018
2  一班  白居易    48    45    47
苏轼 二班
   班级  老师  2016  2017  2018
3  二班  苏轼    33    37    33
'''
### 可以选定df若干列进行分组
# 方法一:
df[[2016,2017]].groupby(df['班级']).sum()         # 以'班级'为组,对[2016,2017]进行分组
'''
    2016  2017
班级            
一班   120   126
二班    64    68
'''

# 方法二:
df[['班级',2016,2017]].groupby('班级').sum()        # 与上面的结果相同
'''
    2016  2017
班级            
一班   120   126
二班    64    68
'''
### 如果不想用本身的列进行分组,还可以额外指定分组
df.groupby([[1,1,1,2,2],['a','a','b','b','c']]).sum()
'''
1 a    72    81    94
  b    48    45    47
2 b    33    37    33
  c    31    31    43
'''

四. 时间序列

"""时间序列"""
ts = Series(np.arange(10), index = pd.date_range('2018-03-25',periods=10))
'''
2018-03-25    0
2018-03-26    1
2018-03-27    2
2018-03-28    3
2018-03-29    4
2018-03-30    5
2018-03-31    6
2018-04-01    7
2018-04-02    8
2018-04-03    9
Freq: D, dtype: int32
'''

'''
date_range()  参数
start   起始时间
en      结束时间 
periods 时间范围(有起始结束则不用设置此参数)
freq    时间间隔  [时间]+[单位]   Y年  M月   D天   WOM某个月的某一周
tz      时区
'''

pd.date_range('2018-01-01','2018-01-31',freq='2D')
'''
DatetimeIndex(['2018-01-01', '2018-01-03', '2018-01-05', '2018-01-07',
               '2018-01-09', '2018-01-11', '2018-01-13', '2018-01-15',
               '2018-01-17', '2018-01-19', '2018-01-21', '2018-01-23',
               '2018-01-25', '2018-01-27', '2018-01-29', '2018-01-31'],
              dtype='datetime64[ns]', freq='2D')
'''
# https://www.baidu.com/link?url=vAxHkSs07PZqNJR-gd64D-1WjPwhgsRMDmMtc51dy4qJjHvWDFzAst2ksPmhiVEK&wd=&eqid=e51a12da00098bd7000000065c218a9d
ts.resample('3D').sum()     # 每三天合并一组,resample只能用于时间格式序列的数据
'''
2018-03-25     3
2018-03-28    12
2018-03-31    21
2018-04-03     9
Freq: 3D, dtype: int32
'''

五. 文件读写

'''读写'''
# 写csv文件
df.to_csv('a.txt')                  # 第一行为column,第一列为index
df.to_csv('a.txt', header=None)     # 不要column名了

# 读
read_df = pd.read_csv('a.txt',header=None)
pd.read_table('a.txt',sep=',')

NSGA-Ⅱ算法:从原理到实战,解锁多目标优化难题 本文深入解析NSGA-Ⅱ算法在多目标优化中的应用,从原理到实战全面覆盖。通过快速非支配排序、精英策略和拥挤度比较三大创新,NSGA-Ⅱ有效解决了传统算法的效率与多样性问题。结合工业案例展示其在注塑工艺优化中的显著效果,为工程师提供实用解决方案。 阅读详情

相关推荐

大数据工程中的多模态数据处理技术

模态”(Modality)指的是数据的表现形式文本(Text):新闻、评论、文案等;图像(Image):照片、截图、医学影像等;音频(Audio):语音、音乐、环境声音等;视频(Video):短视频、监控视频、电影等(本质是图像+音频的组合);数值/结构化数据(Numerical/Structured):用户年龄、商品价格、传感器数据等;时间序列(Time Series):股票价格、物流轨迹、心率数据等。多模态数据(Multimodal Data)是指包含两种或以上模态的数据集。

AI云原生与云计算技术学院 1268

Pandas数据选取中df[]、df.loc[]、df.iloc[]、df.at[]、df.iat[]的区别及用法

  Pandas是作为Python数据分析著名的工具包,提供了多种数据选取的方法,方便实用。本文主要介绍Pandas的几种数据选取的方法。   Pandas中,数据主要保存为Dataframe和Series是数据结构,这两种数据结构数据选取的方式基本一致,本文主要以Dataframe为例进行介绍。   在Dataframe中选取数据大抵包括3中情况:   1)行(列)选取(单维度选取):df[]。这种情况一次只能选取行或者列,即一次选取中,只能为行或者列设置筛选条件

金戈鐡馬 1万+

逆向选择启示录:一个失败高频策略如何意外跑赢市场

本文探讨了高频交易中的逆向选择现象,揭示了一个失败的高频策略如何通过简化意外跑赢市场。通过加密货币市场的实证分析和蒙特卡洛模拟,研究发现低预测性的简单策略反而更具鲁棒性,有效规避了逆向选择风险。文章还提供了小币种做市策略的优化框架和实践建议,为量化交易者提供了宝贵洞见。

weixin_29191669的博客 400

【pandas】--DataFrame数据筛选(二)

dataframe的数据的选择和筛选

panbaoran913的博客 1万+

北斗导航 | 接收机自主完好性监测(RAIM)算法近三年研究现状总结(2022-2025)

近三年RAIM算法已从传统的单故障检测演进为多星座协同、智能融合的复杂系统,在航空、自动驾驶等安全关键领域实现规模化应用。未来需重点突破城市复杂环境适应性和标准化体系建设,推动技术从"可用"向"可信"跨越。

尘世冰封的专栏 438

YOLOv11改进策略【损失函数篇】| WIoU v3:针对低质量样本的边界框回归损失函数

是一种基于IoU的损失函数,旨在解决目标检测中边界框回归损失函数在处理低质量训练数据时的问题。论文链接:https://arxiv.org/pdf/2301.10051 源码链接:https://github.com/Instinct323/wiou此处需要查看的文件是中定义了模型的损失函数和计算方法,我们想要加入新的损失函数就只需要将代码放到这个文件内即可将下方的函数替换原本的函数即可: 用于计算各种损失。在内修改如下代码,使模型调用此损失函数。 tal.py中是一些损失函数的功能应用。在内修改如下代码,

Limiiiing的博客 3788

python数据分析与展示--Pandas库入门

数据分析

小马哥的博客 1260

C语言程序设计——单词的统计和替换

【任务描述】 对任意一篇英文文章,统计其中每个单词分别出现了多少次,并可替换指定的单词。⑶ 对单词进行替换时,允许用户选择全部替换或逐个替换。替换完成后,将文章保存到文件。⑴ 英文文章以文件形式输入。⑵ 统计的结果保存到文件。

m0_60738889的博客 809

pandas的数据引入

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

qq_38699445的博客 686

OSPF的7种状态,DR与BDR的基本概念,1、2、3、4、5、7类LSA解析,Stub、NSSA、Totally Stub、Totally NSSA的基本概念与配置

OSPF的7种状态,DR与BDR的基本概念,1、2、3、4、5、7类LSA解析,Stub、NSSA、Totally Stub、Totally NSSA的基本概念与配置

weixin_72194028的博客 3005

华为OD机试真题 新系统【查找能被整除的最大整数】

华为OD新系统机试真题【查找能被整除的最大整数】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【查找能被整除的最大整数】

qq_45776114的博客 669

Pandas 常见错误警告

一、SettingWithCopyWarning 警告 详情如下: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-

鲨鱼儿的博客 1765

人工智能训练师三级考试大纲深度解读|理论+实操分值分布+六大模块占比

三级人工智能训练师考试分为理论和实操两大模块(各100分,合格线60分)。理论考试包含AI基础(30%)、数据标注(25%)、模型训练(20%)、测试(15%)和系统运维(10%),题型为客观题;实操考核侧重数据标注(40%)、模型测试(35%)和系统运维(25%),采用现场操作形式。复习应优先关注AI基础和数据标注等高分值模块,实操需重点掌握标准流程和结果准确性(占评分70%)。考试要求两模块均达标,理论侧重概念理解,实操强调规范执行与文档完整。

白话机器学习 1072

Python数据科学学习笔记之——Pandas数据处理(二)

Pandas 数据处理(续) 7、合并数据集:Concat 与 Append 操作 将不同的数据源进行合并,这既包括将两个不同的数据集非常简单地拼接在一起,也包括用数据库那样的连接(join)和合并(merge)操作处理有重叠字段的数据集。 先来用 pd.concat 函数演示一个 Series 与 DataFrame 的简单合并操作。简单起见,定义一个能够创建 DataFrame 某种形式的函数: def make_df(cols,ind): '''一个简单的 DataFrame '''

前尘忆梦的博客 931

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Python数据科学学习笔记之——Pandas数据处理(一)

Pandas 数据处理 1、安装 Pandas import pandas print(pandas.__version__) # 0.23.4 一般导入 Pandas 时我们使用别名 pd: import pandas as pd 2、Pandas 对象简介 Pandas 的三个基本数据结构:Series、DataFrame 和 Index。 2.1、Pandas 的 Series 对象 Pandas 的 Series 对象是一个带索引数据构成的一维数组。可以用一个数组创建 Series 对象。

前尘忆梦的博客 928

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【Python学习笔记】43:Pandas时序数据处理

学习《Python3爬虫、数据清洗与可视化实战》时自己的一些实践。 Python中时间的一些常用操作 import time # 从格林威治时间到现在,单位秒 print('系统时间戳:', time.time()) print('本地时间按格式转成str:', time.strftime('%Y-%m-%d %X', time.localtime())) # 无参的localtime返回...

大桔骑士的学习笔记 1646

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

python清洗数据 food ounces animal_pandas学习笔记 - 常见的数据处理方式

1.缺失值处理 - 拉格朗日插值法input_file数据文件内容(存在部分缺失值):from scipy.interpolate importlagrangeimportpandas as pdimport numpy as npinput_file= './data/catering_sale.xls'output_file= './data/sales.xls'data=pd.read_ex...

weixin_39950470的博客 248

Numpy & Pandas (莫烦 Python 数据处理教程)-Pandas学习笔记(5)-Pandas合并

Pandas学习笔记(5)-Pandas合并 df1 = pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d']) df2 = pd.DataFrame(np.ones((3,4))*1,columns=['a','b','c','d']) df3 = pd.DataFrame(np.ones((3,4))*2,columns=['a','b','c','d']) print(df1) print(df2) print(df3) #out:

weixin_41281151的博客 285

python数据处理--数据分析库pandas学习笔记

import pandas    #导入pandas库 food_info = pandas.read_csv("food_info.csv")    #pandas中的read函数 print (type(food_info))     print (food_info.dtypes)    #使用dtype函数打印数据的基本格式 print (help(pandas.read_csv))#输出...

oYunQi123的博客 308

Numpy & Pandas (莫烦 Python 数据处理教程)-Pandas学习笔记(2)-Pandas选择数据

Pandas学习笔记(1)-Pandas的基本介绍 教程视频为B站莫烦 Python 数据处理教程 第11课程 导入模块 import pandas as pd import numpy as np 数据选择 dates = pd.date_range('20130101',periods=6) df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates,columns=['A','B','C','D']) print(df) #out:

weixin_41281151的博客 409

Numpy & Pandas (莫烦 Python 数据处理教程)-Pandas学习笔记(1)-Pandas的基本介绍

Pandas学习笔记(1)-Pandas的基本介绍 教程视频为B站莫烦 Python 数据处理教程 第11课程 导入模块 import pandas as pd import numpy as np 用pd定义一个列表的方法 pd.Series s = pd.Series([1,3,6,np.nan,44,1]) dates = pd.date_range('20160101',periods=6) print(dates) #out: DatetimeIndex(['2016-01-01', '201

weixin_41281151的博客 614

【Python3 爬虫学习笔记】Pandas:强大的数据处理套件 2

DataFrame数据的修改及排序 DataFrame数据的修改 修改DataFrame数据的操作非常简单,只需要把上例中读取的数据项设定为指定值即可。例如,把陈聪明的数学成绩修改为91: df.ix[&quot;陈聪明&quot;][&quot;数学&quot;] = 91 或把陈聪明的所有成绩都改为80: df.ix[&quot;陈聪明&quot;, :] = 80 DataFrame数据的排序 Pandas提供了两种DataFram

冰度猎魂的博客 417

Numpy & Pandas (莫烦 Python 数据处理教程)-Pandas学习笔记(3)-设置值

Pandas学习笔记(3)-设置值 教程视频为B站莫烦 Python 数据处理教程 第13课程 import pandas as pd import numpy as np dates = pd.date_range('20130101',periods=6) df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates,columns=['A','B','C','D']) df.iloc[2,2]=1111 df.loc['20130101','

weixin_41281151的博客 305

Python数据处理基础(学习笔记分享)

本文介绍了Python中三个常用数据处理库的核心功能: NumPy - 提供高效数值计算,核心是ndarray多维数组,支持数组创建、运算、统计、索引切片和矩阵操作。 Pandas - 数据分析核心库,提供DataFrame和Series数据结构,支持数据读取、清洗、筛选、分组聚合和缺失值处理等表格操作。 JSON - 轻量级数据交换格式,Python中内置支持,用于结构化数据的序列化和反序列化。 这些库共同构成了Python数据处理的基础工具链,适合进行科学计算、数据分析和结

snowfoootball的博客 1351

pandas学习笔记

series按照作者的目前的理解是pandas库中最基础的组成部分,seriers是由索引和数值做成,series很像c语言中的一维数组,两者都可以通过索引寻找对应的值。对于series的值而言,它也可以是任意的数据类型,如整数,浮点数,字符串等。.describle()用于对数据进行一个初步的整体分析,使用后会显示以下数据:每一列的平均数(mean),标准差(std),最大值(max),最小值(min),不为空值的数据统计(count),25%分位数,50%分位数,75%分位数。(这个参数是必须的)

kara_486的博客 1051

Python数据处理性能对比,原生,Pandas,Numpy哪个更优秀_numpy和pandas效率对比

🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取。

m0_60452141的博客 797
上一篇: Python数据处理:Numpy 学习笔记
下一篇: IntelliJ IDEA 常用快捷键 ------ Windows / Mac 对比
郭Albert
博客等级 码龄14年 110粉丝 57原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭Albert

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值