利用Python进行数据分析笔记-pandas基础

这篇博客介绍了Pandas库的基础知识,包括Series和DataFrame的使用。内容涵盖重复值处理、汇总统计、索引选择、数据对齐、排序以及DataFrame与Numpy的转换。文章详细阐述了数据操作的关键功能,如reindexing、drop、算术运算、函数应用和排序,为Python数据分析打下基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import pandas as pd
from pandas import Series, DataFrame
import numpy as np

Series基础

obj = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
obj
d    4
b    7
a   -5
c    3
dtype: int64
# 命名
obj.name = 'Series Name'
obj.index.name = 'index'
obj
index
d    4
b    7
a   -5
c    3
Name: Series Name, dtype: int64
print('左边的index:', obj.index)
print('右边的values:', obj.values)
print('索引a:', obj['a'])
print('判断:', 'b' in obj)

print('\n索引b/d/c: \n', obj[['b','d','c']])
print('\n大于0的:\n',obj[obj > 0])
左边的index: Index(['d', 'b', 'a', 'c'], dtype='object', name='index')
右边的values: [ 4  7 -5  3]
索引a: -5
判断: True

索引b/d/c: 
 index
b    7
d    4
c    3
Name: Series Name, dtype: int64

大于0的:
 index
d    4
b    7
c    3
Name: Series Name, dtype: int64
# isnul 及 notnull
obj[obj>0].isnull()
index
d    False
b    False
c    False
Name: Series Name, dtype: bool

DataFrame基础

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], 
        'year': [2000, 2001, 2002, 2001, 2002, 2003], 
        'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data)
frame
popstateyear
01.5Ohio2000
11.7Ohio2001
23.6Ohio2002
32.4Nevada2001
42.9Nevada2002
53.2Nevada2003
# 自定义排序
df = pd.DataFrame(frame, columns=['year', 'state', 'pop'])
# 返回前面多少行  head()默认5行
df.head(3)
yearstatepop
02000Ohio1.5
12001Ohio1.7
22002Ohio3.6
# 返回尾部多少行  tail()默认5行
df.tail(3)
yearstatepop
32001Nevada2.4
42002Nevada2.9
52003Nevada3.2
# 导入一个不存在的列名,会显示为缺失数据NaN
# 更改 index
df2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'], 
                      index=['one', 'two', 'three', 'four', 'five', 'six'])
df2
yearstatepopdebt
one2000Ohio1.5NaN
two2001Ohio1.7NaN
three2002Ohio3.6NaN
four2001Nevada2.4NaN
five2002Nevada2.9NaN
six2003Nevada3.2NaN
# 查看某列数据 方法一
df2['year'].head(3)
one      2000
two      2001
three    2002
Name: year, dtype: int64
# 查看某列数据 方法二
df2.year
one      2000
two      2001
three    2002
four     2001
five     2002
six      2003
Name: year, dtype: int64


注意:df2[column]能应对任何列名,但df2.column的情况下,列名必须是有效的python变量名才行。

# 查看某行数据
df2.loc['three']
year     2002
state    Ohio
pop       3.6
debt      NaN
Name: three, dtype: object
# 查看某行数据,利用index
df2.iloc[2:5]
yearstatepopdebt
three2002Ohio3.6NaN
four2001Nevada2.4NaN
five2002Nevada2.9NaN
# 每隔两个元素选一个元素
df2.iloc[::2]
yearstatepopdebt
one2000Ohio1.5NaN
three2002Ohio3.6NaN
five2002Nevada2.9NaN
# 给debt列赋值
df2['debt'] = np.arange(6.)
df2
yearstatepopdebt
one2000Ohio1.50.0
two2001Ohio1.71.0
three2002Ohio3.62.0
four2001Nevada2.43.0
five2002Nevada2.94.0
six2003Nevada3.25.0
# 给不存列赋值会新增列
df2['eastern'] = df2.state == 'Ohio'
df2
yearstatepopdebteastern
one2000Ohio1.50.0True
two2001Ohio1.71.0True
three2002Ohio3.62.0True
four2001Nevada2.43.0False
five2002Nevada2.94.0False
six2003Nevada3.25.0False
# 删除列
del df2['eastern']
df.columns # 注意:columns返回的是一个view,而不是新建了一个copy。因此,任何对series的改变,会反映在DataFrame上
Index(['year', 'state', 'pop'], dtype='object')
# DataFrame可以像numpy数组一样做转置
df2.T
onetwothreefourfivesix
year200020012002200120022003
stateOhioOhioOhioNevadaNevadaNevada
pop1.51.73.62.42.93.2
debt012345
# 给DataFrame的index和column命名
df2.index.name = '索引名'
df2.columns.name = '行名'
df2
行名yearstatepopdebt
索引名
one2000Ohio1.50.0
two2001Ohio1.71.0
three2002Ohio3.62.0
four2001Nevada2.43.0
five2002Nevada2.94.0
six2003Nevada3.25.0
# 查看列名
print('全部列名:', df2.columns)
print('判断:', 'debt' in df2.columns)
全部列名: Index(['year', 'state', 'pop', 'debt'], dtype='object', name='行名')
判断: True
# 查看索引
print('全部索引:',df2.index)
print('索引切片:',df2.index[1:3])
# df2.index[1] = 'd'  # 会出错,index object是不可更改的
全部索引: Index(['one', 'two', 'three', 'four', 'five', 'six'], dtype='object', name='索引名')
索引切片: Index(['two', 'three'], dtype='object', name='索引名')
# 查看值
df2.values
array([[2000, 'Ohio', 1.5, 0.0],
       [2001, 'Ohio', 1.7, 1.0],
       [2002, 'Ohio', 3.6, 2.0],
       [2001, 'Nevada', 2.4, 3.0],
       [2002, 'Nevada', 2.9, 4.0],
       [2003, 'Nevada', 3.2, 5.0]], dtype=object)

与python里的set不同,pandas的index可以有重复的labels,在这种重复的标签中选择的话,会选中所有相同的标签。

dup_labels = pd.Index(['foo', 'foo', 'bar', 'bar'])
dup_labels
Index(['foo', 'foo', 'bar', 'bar'], dtype='object')

Index还有一些方法和属性:

重复值

values = pd.Series(['apple', 'orange', 'apple', 'apple'] * 2)
values
0     apple
1    orange
2     apple
3     apple
4     apple
5    orange
6     apple
7     apple
dtype: object
# 判断是否唯一
values.is_unique
False
# 提取唯一值
pd.unique(values)
array(['apple', 'orange'], dtype=object)
# 统计值出现次数
pd.value_counts(values)
apple     6
orange    2
dtype: int64
# 用take方法来构造重新
values = pd.Series([0, 1, 0, 0] * 2)
dim = pd.Series(['apple', 'orange'])
dim.take(values)
0     apple
1    orange
0     apple
0     apple
0     apple
1    orange
0     apple
0     apple
dtype: object

汇总和描述性统计

df = pd.DataFrame([[1.4, np.nan], [7.1, -4.5],
                   [np.nan, np.nan], [0.75, -1.3]],
                  index=['a', 'b', 'c', 'd'],
                  columns=['one', 'two'])
df
onetwo
a1.40NaN
b7.10-4.5
cNaNNaN
d0.75-1.3
df.sum()
one    9.25
two   -5.80
dtype: float64
df.sum(axis='columns')
a    1.40
b    2.60
c    0.00
d   -0.55
dtype: float64

计算的时候,NA(即缺失值)会被除外,除非整个切片全是NA。我们可以用skipna来跳过计算NA:

df.mean(axis='columns', skipna=False)
a      NaN
b    1.300
c      NaN
d   -0.275
dtype: float64
# 查看基本信息
df.info()
# 数值性的数据
df.describe()
onetwo
count3.0000002.000000
mean3.083333-2.900000
std3.4936852.262742
min0.750000-4.500000
25%1.075000-3.700000
50%1.400000-2.900000
75%4.250000-2.100000
max7.100000-1.300000
# 非数值性的数据
obj = pd.Series(['a', 'a', 'b', 'c'] * 4)
obj.describe()
count     16
unique     3
top        a
freq       8
dtype: object

下表是一些描述和汇总统计数据:

相关性与协方差

price = pd.read_pickle('../examples/yahoo_price.pkl')
# 查看前五行
price.head()
AAPLGOOGIBMMSFT
Date
2010-01-0427.990226313.062468113.30453625.884104
2010-01-0528.038618311.683844111.93582225.892466
2010-01-0627.592626303.826685111.20868325.733566
2010-01-0727.541619296.753749110.82373225.465944
2010-01-0827.724725300.709808111.93582225.641571
# pct_change()计算同colnums两个相邻的数字之间的变化率
returns = price.pct_change()

# 查看后五行
returns.tail()
AAPLGOOGIBMMSFT
Date
2016-10-17-0.0006800.0018370.002072-0.003483
2016-10-18-0.0006810.019616-0.0261680.007690
2016-10-19-0.0029790.0078460.003583-0.002255
2016-10-20-0.000512-0.0056520.001719-0.004867
2016-10-21-0.0039300.003011-0.0124740.042096
# 皮尔森相关系数
returns.corr()
AAPLGOOGIBMMSFT
AAPL1.0000000.4079190.3868170.389695
GOOG0.4079191.0000000.4050990.465919
IBM0.3868170.4050991.0000000.499764
MSFT0.3896950.4659190.4997641.000000
# 计算dataframe中不同columns之间,或row之间的相似性
returns.corrwith(returns['IBM'])
AAPL    0.386817
GOOG    0.405099
IBM     1.000000
MSFT    0.499764
dtype: float64
# 方差矩阵
returns.cov()
AAPLGOOGIBMMSFT
AAPL0.0002770.0001070.0000780.000095
GOOG0.0001070.0002510.0000780.000108
IBM0.0000780.0000780.0001460.000089
MSFT0.0000950.0001080.0000890.000215

唯一值,值计数,会员

# 唯一性
obj = pd.Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])
uniques = obj.unique()
uniques
array(['c', 'a', 'd', 'b'], dtype=object)
# 统计数值
obj.value_counts()
c    3
a    3
b    2
d    1
dtype: int64
# 统计数值
pd.value_counts(obj.values, sort=False)
b    2
a    3
c    3
d    1
dtype: int64
# 判断
mask = obj.isin(['b', 'c'])
mask
0     True
1    False
2    False
3    False
4    False
5     True
6     True
7     True
8     True
dtype: bool
# 过滤
obj[obj.isin(['a', 'd'])]
1    a
2    d
3    a
4    a
dtype: object
# 判断a的values在b的索引位置
a = pd.Series(['c', 'a', 'b', 'b', 'c', 'a'])
b = pd.Series(['c', 'b', 'a'])

pd.Index(b).get_indexer(a)
array([0, 2, 1, 1, 0, 2], dtype=int64)

主要功能

1、Reindexing(重新索引)

Series中应用

obj = pd.Series([4.5, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c'])
obj
d    4.5
b    7.2
a   -5.3
c    3.6
dtype: float64
# 在series上调用reindex能更改index,如果没有对应index的话会引入缺失数据
obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'])
obj2
a   -5.3
b    7.2
c    3.6
d    4.5
e    NaN
dtype: float64
obj3 = pd.Series(['bule', 'purple', 'yellow'], index=[0, 2, 4])
obj3
0      bule
2    purple
4    yellow
dtype: object
# 在reindexing的时候需要修改值。method选项能做到这一点,比如设定method为ffill
obj3.reindex(range(6), method='ffill')
0      bule
1      bule
2    purple
3    purple
4    yellow
5    yellow
dtype: object

对于DataFrame,reindex能更改row index,或column index。reindex the rows

df = pd.DataFrame(np.arange(9).reshape(3, 3),
                     index=['a', 'c', 'd'],
                     columns=['Ohio', 'Texas', 'California'])
df
OhioTexasCalifornia
a012
c345
d678
# 更改索引 方法一
# 缺失值填充为0    fill_value=0
df2 = df.reindex(index=['a', 'b', 'c', 'd'], columns=['Texas', 'Utah', 'California'], fill_value=0)
df2
TexasUtahCalifornia
a102
b000
c405
d708
# 更改索引 方法二
df.loc[['a', 'b', 'c', 'd'], ['Texas', 'Utah', 'California']]
TexasUtahCalifornia
a1.0NaN2.0
bNaNNaNNaN
c4.0NaN5.0
d7.0NaN8.0

2、drop() 按轴删除记录

对于series,drop回返回一个新的object,并删去你制定的axis的值

obj = pd.Series(np.arange(5.), index=['a', 'b', 'c', 'd', 'e'])
print('删除后:\n', obj.drop(['b','d']))
print('原来的:\n', obj)
删除后:
a    0.0
c    2.0
e    4.0
dtype: float64
原来的:
a    0.0
b    1.0
c    2.0
d    3.0
e    4.0
dtype: float64

对于DataFrame,index能按行或列的axis来删除:

df = pd.DataFrame(np.arange(16).reshape(4, 4),
                    index=['Ohio', 'Colorado', 'Utah', 'New York'],
                    columns=['one', 'two', 'three', 'four'])
df
onetwothreefour
Ohio0123
Colorado4567
Utah891011
New York12131415
# 删除行,不用指定 axis=0
df.drop(['Colorado', 'Ohio'])
onetwothreefour
Utah891011
New York12131415
# 删除列,必须指定 axis=1 或 axis='columns'
df.drop('two', axis=1)
onethreefour
Ohio023
Colorado467
Utah81011
New York121415
# 不返回一个新的object,直接修改原DataFrame  inplace=True
df.drop(['one','four'], axis='columns', inplace=True)
df
twothree
Ohio12
Colorado56
Utah910
New York1314

3、Indexing, Selection, and Filtering(索引,选择,过滤)

data = pd.DataFrame(np.arange(16).reshape((4, 4)),
                    index=['Ohio', 'Colorado', 'Utah', 'New York'],
                    columns=['one', 'two', 'three', 'four'])
data
onetwothreefour
Ohio0123
Colorado4567
Utah891011
New York12131415
# 查询
data[data['three'] > 5]
onetwothreefour
Colorado4567
Utah891011
New York12131415
# 查询并赋值
data[data < 5] = 0
data
onetwothreefour
Ohio0000
Colorado0567
Utah891011
New York12131415
# loc[x,y] x表示列索引,y表示行索引
data.loc['Colorado', ['two', 'three']]
two      5
three    6
Name: Colorado, dtype: int32
# iloc 表示用索引值
data.iloc[2, [3, 0, 1]]
four    11
one      8
two      9
Name: Utah, dtype: int32
# 索引切片
data.iloc[:, :3][data.three > 5]
onetwothree
Colorado056
Utah8910
New York121314

pandas中有很多用于选择和重新选择数据的方法:

ser2 = pd.Series(np.arange(3.), index=['a', 'b', 'c'])
ser2
a    0.0
b    1.0
c    2.0
dtype: float64

4、算数和数据对齐

df1 = pd.DataFrame(np.arange(12.).reshape((3, 4)), columns=list('abcd'))
df2 = pd.DataFrame(np.arange(20.).reshape((4, 5)), columns=list('abcde'))
df2
abcde
00.01.02.03.04.0
15.06.07.08.09.0
210.011.012.013.014.0
315.016.017.018.019.0
df1
abcd
00.01.02.03.0
14.05.06.07.0
28.09.010.011.0
# 填充缺失值
df2.loc[1, 'b'] = np.nan
df2
abcde
00.01.02.03.04.0
15.0NaN7.08.09.0
210.011.012.013.014.0
315.016.017.018.019.0
# 缺失值自动填充NaN
df1 + df2
abcde
00.02.04.06.0NaN
19.011.013.015.0NaN
218.020.022.024.0NaN
3NaNNaNNaNNaNNaN
# 缺失值自动填充0
df1.add(df2, fill_value=0)
abcde
00.02.04.06.04.0
19.011.013.015.09.0
218.020.022.024.014.0
315.016.017.018.019.0

下表中就有很多这样灵活的算数方法:

每一个都有一个配对的,以 r 开头,意思是反转:

1 / df1
abcd
0inf1.0000000.5000000.333333
10.2500000.2000000.1666670.142857
20.1250000.1111110.1000000.090909
df1.rdiv(1)
abcd
0inf1.0000000.5000000.333333
10.2500000.2000000.1666670.142857
20.1250000.1111110.1000000.090909

5、DataFrame和Series之间的操作

df = pd.DataFrame(np.arange(12.).reshape((4, 3)),
                     columns=list('bde'),
                    index=['Utah', 'Ohio', 'Texas', 'Oregon'])
series = df.iloc[0]
df
bde
Utah0.01.02.0
Ohio3.04.05.0
Texas6.07.08.0
Oregon9.010.011.0
series
b    0.0
d    1.0
e    2.0
Name: Utah, dtype: float64
# 这个减法是用在了每一行上
df - series
bde
Utah0.00.00.0
Ohio3.03.03.0
Texas6.06.06.0
Oregon9.09.09.0
# 纵向相减 axis=1 or axis=columns'
df.sub(series, axis='columns')
bde
Utah0.00.00.0
Ohio3.03.03.0
Texas6.06.06.0
Oregon9.09.09.0

如果想要广播列,去匹配行,必须要用到算数方法:

series2 = df['d']
series2
Utah       1.0
Ohio       4.0
Texas      7.0
Oregon    10.0
Name: d, dtype: float64
# 纵向相减 axis=0 or axis='index'
df.sub(series2, axis=0)
bde
Utah-1.00.01.0
Ohio-1.00.01.0
Texas-1.00.01.0
Oregon-1.00.01.0

6、DataFrame转为Numpy数组

要想把一个DataFrame变为Numpy数组,使用.values属性

data = pd.DataFrame({'x0': [1, 2, 3, 4, 5], 
                     'x1': [0.01, -0.01, 0.25, -4.1, 0.], 
                     'y': [-1.5, 0., 3.6, 1.3, -2.]})
data
x0x1y
010.01-1.5
12-0.010.0
230.253.6
34-4.101.3
450.00-2.0
data.values
array([[ 1.  ,  0.01, -1.5 ],
       [ 2.  , -0.01,  0.  ],
       [ 3.  ,  0.25,  3.6 ],
       [ 4.  , -4.1 ,  1.3 ],
       [ 5.  ,  0.  , -2.  ]])

7、函数应用和映射

numpy的ufuncs(element-wise数组方法)也能用在pandas的object上

frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'), 
                     index=['Utah', 'Ohio', 'Texas', 'Oregon'])
frame
bde
Utah-1.062629-0.501572-1.797577
Ohio-0.143117-0.177578-0.738473
Texas0.317834-0.6328251.258225
Oregon2.541097-0.9511971.021166
# 会产生新 object
np.abs(frame)
bde
Utah1.0626290.5015721.797577
Ohio0.1431170.1775780.738473
Texas0.3178340.6328251.258225
Oregon2.5410970.9511971.021166

另一个常用的操作是把一个用在一维数组上的函数,应用在一行或一列上。要用到DataFrame中的apply函数:

f = lambda x: x.max() - x.min()
frame.apply(f, axis=0) # axis=0 可以不用写,默认就是纵向
b    3.603726
d    0.773618
e    3.055802
dtype: float64
frame.apply(f, axis=1) # axis=1 必须写
Utah      1.296006
Ohio      0.595356
Texas     1.891050
Oregon    3.492293
dtype: float64

像是sum, mean这样的数组统计方法,DataFrame中已经集成了,所以没必要用apply。

apply不会返回标量,只会返回一个含有多个值的series:

def f(x): 
    return pd.Series([x.min(), x.max()], index=['min', 'max'])

frame
bde
Utah-1.062629-0.501572-1.797577
Ohio-0.143117-0.177578-0.738473
Texas0.317834-0.6328251.258225
Oregon2.541097-0.9511971.021166
frame.apply(f)
bde
min-1.062629-0.951197-1.797577
max2.541097-0.1775781.258225

element-wise的python函数也能用。假设想要格式化frame中的浮点数,变为string。可以用apply map:

format = lambda x: '%.2f' % x
frame.applymap(format)
bde
Utah-1.06-0.50-1.80
Ohio-0.14-0.18-0.74
Texas0.32-0.631.26
Oregon2.54-0.951.02

applymap的做法是,series有一个map函数,能用来实现element-wise函数:

frame['e'].map(format)
Utah      -1.80
Ohio      -0.74
Texas      1.26
Oregon     1.02
Name: e, dtype: object

8、排序

  • 缺失值会被排在最后

按row或column index来排序的话,可以用sort_index方法,会返回一个新的object

(1)、sort_index 按索引值排序
obj = pd.Series(range(4), index=['d', 'a', 'b', 'c'])
obj.sort_index()
a    1
b    2
c    3
d    0
dtype: int64

在DataFrame,可以用index或其他axis来排序

frame = pd.DataFrame(np.arange(8).reshape((2, 4)),
                     index=['three', 'one'],
                     columns=['d', 'a', 'b', 'c'])
frame
dabc
three0123
one4567
# frame.sort_index(axis='index') 
frame.sort_index()  # 效果同上
dabc
one4567
three0123
# ascending=False 默认是升序,可以设置降序
frame.sort_index(axis=1, ascending=False)
dcba
three0321
one4765
(2)、按values值排序
# 按three横向排序
frame.sort_values(by='three', axis=1, ascending=True)
dabc
three0123
one4567
(3)、rank()

ranking(排名)是给有效的数据分配数字。rank方法能用于series和DataFrame,rank方法默认会给每个group一个mean rank(平均排名)。rank 表示在这个数在原来的Series中排第几名,有相同的数,取其排名平均(默认)作为值

obj = pd.Series([7, -5, 7, 4, 2, 0, 4])
obj
0    7
1   -5
2    7
3    4
4    2
5    0
6    4
dtype: int64
obj.sort_values()
1   -5
5    0
4    2
3    4
6    4
0    7
2    7
dtype: int64
obj.rank()
0    6.5
1    1.0
2    6.5
3    4.5
4    3.0
5    2.0
6    4.5
dtype: float64

在obj中,4和4的排名是第4名和第五名,取平均得4.5。7和7的排名分别是第六名和第七名,则其排名取平均得6.5。

rank也可以根据数据被观测到的顺序来设定:

obj.rank(method='first')
0    6.0
1    1.0
2    7.0
3    4.0
4    3.0
5    2.0
6    5.0
dtype: float64

这里没有给0和2(指两个数字7)赋予average rank 6.5,而是给第一个看到的7(label 0)设置rank为6,第二个看到的7(label 2)设置rank为7。

也可以设置降序:

obj.rank(ascending=False, method='max')
0    2.0
1    7.0
2    2.0
3    4.0
4    5.0
5    6.0
6    4.0
dtype: float64

dataframe 可以根据行或列来计算rank:

frame = pd.DataFrame({'b': [4.3, 7, -3, 2],
                      'a': [0, 1, 0, 1],
                      'c': [-2, 5, 8, -2.5]})
frame
abc
004.3-2.0
117.05.0
20-3.08.0
312.0-2.5
frame.rank(axis='columns') # columns表示列与列之间的排序(即每一行里数据间的排序)
abc
02.03.01.0
11.03.02.0
22.01.03.0
32.03.01.0

9、有重复label的轴索引

我们看到的所有例子都有unique axis labels(index values),唯一的轴标签(索引值)。一些pandas函数(reindex),需要label是唯一的,但这并是不强制的。比如下面有一个重复的索引:

obj = pd.Series(range(5), index=['a', 'a', 'b', 'b', 'c'])
obj
a    0
a    1
b    2
b    3
c    4
dtype: int64
# 判断index值是否唯一
obj.index.is_unique
False

数据选择对于重复label则表现有点不同。如果一个label有多个值,那么就会返回一个series, 如果是label只对应一个值的话,会返回一个标量:

obj['a']
a    0
a    1
dtype: int64

这个选择的逻辑也应用于DataFrame:

df = pd.DataFrame(np.random.randn(4, 3), index=['a', 'a', 'b', 'b'])
df
012
a-1.241237-1.0360600.943747
a-0.429217-1.0292681.979792
b0.095657-0.8764780.096081
b0.0349210.7037860.293833
df.loc['b']
012
b0.095657-0.8764780.096081
b0.0349210.7037860.293833
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值