Python学习笔记:Pandas应用

使用列表创建DataframePandas优点:

  • 处理浮点与非浮点数据里的缺失数据,表示为 NaN

  • 大小可变:插入或删除 DataFrame 等多维对象的列;

  • 自动、显式数据对齐:显式地将对象与一组标签对齐,也可以忽略标签,在 Series、DataFrame 计算时自动与数据对齐;

  • 强大、灵活的**分组(group by)**功能:拆分-应用-组合数据集,聚合、转换数据;

  • 把 Python 和 NumPy 数据结构里不规则、不同索引的数据轻松地转换为 DataFrame 对象;

  • 基于智能标签,对大型数据集进行切片花式索引子集分解等操作;

  • 直观地合并(merge)、**连接(join)**数据集;

  • 灵活地重塑(reshape)、**透视(pivot)**数据集;

  • 支持结构化标签:一个刻度支持多个标签;

  • 成熟的 IO 工具:读取文本文件(CSV 等支持分隔符的文件)、Excel 文件、数据库等来源的数据,利用超快的 HDF5 格式保存 / 加载数据;

  • 时间序列:支持日期范围生成、频率转换、移动窗口统计、移动窗口线性回归、日期位移等时间序列功能。

创建Dataframe的方法

pandas.DataFrame( data, index, columns, dtype, copy) 构造方法
    data:一组数据(ndarray、series, map, lists, dict 等类型)
    index:索引值,或者可以称为行标签。
    columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
    dtype:数据类型。
    copy:拷贝数据,默认为 False。
#使用list列表创建DataFrame
data1 = [['a',1.0],['b',2.0],['c',3.0],]
df1 = pd.DataFrame(data1,columns=['key','value'])
print(df1)
print('----------------------------')
print(df1.dtypes)
key  value
0   a    1.0
1   b    2.0
2   c    3.0
----------------------------
key       object
value    float64
dtype: object
#使用List创建DataFrame
list1=["class1",'class2','class3','class4','class5']
list2=list('abcdef')
list3 = [[3,4,5,6,8,10],[2,3,5,1,9,11],[4,2,9,0,2,3],[14,12,19,10,12,13],[24,22,292,20,22,23]]
df  = pd.DataFrame(list3,index=list1,columns=list2)
print(df)
         a   b    c   d   e   f
class1   3   4    5   6   8  10
class2   2   3    5   1   9  11
class3   4   2    9   0   2   3
class4  14  12   19  10  12  13
class5  24  22  292  20  22  23

#使用字典创建Dataframe
data2 = {'name':['a1','a2','a3'],'age':[12,20,18]}
df= pd.DataFrame(data2,index =["class1",'class2','class3'])
print(df2)
print('----------------------------')
print(df2.dtypes)
        name  age
class1   a1   12
class2   a2   20
class3   a3   18
----------------------------
name    object
age      int64
dtype: object
#使用字典创建 Dataframe
data1 = {'a':1,'b':2,'c':3},{'a':3,'b':5,'c':3},{'a':3,'b':2,}
df3 = pd.DataFrame(data1,dtype=int)
print(df3)
print('----------------------------')
print(df3.dtypes)
   a  b    c
0  1  2  3.0
1  3  5  3.0
2  3  2  NaN
----------------------------
a      int32
b      int32
c    float64
dtype: object
#创建一组日期DataFrame
index = pd.date_range('1/1/2000', periods=8)
print(index)
DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04',
               '2000-01-05', '2000-01-06', '2000-01-07', '2000-01-08'],
              dtype='datetime64[ns]', freq='D')
#numpy创建DataFrame
import numpy as np
list1=['a1','a2','a3','a4','a5','a6']
list2=['A','B','C']
df = pd.DataFrame(np.random.randn(6, 3), index=list1,columns=list2)
print(df)
           A         B         C
a1 -0.342545 -1.714921 -0.006376
a2  3.010536  0.198070 -0.360081
a3  1.416659  0.803343 -0.917506
a4  0.007565  1.076642 -1.037496
a5  0.428244 -0.953278 -0.265666
a6 -1.558382  1.002403  0.226359
#numpy创建DataFrame
df1 = pd.DataFrame(np.arange(12).reshape((4, 3)), columns=list('abc'), index=['1', '2', '3','4'])
   a   b   c
1  0   1   2
2  3   4   5
3  6   7   8
4  9  10  11

Pandas设置数据显示格式

display.max_rows           最大显示行数,超过该值用省略号代替,为None时显示所有行。
display.max_columns        最大显示列数,超过该值用省略号代替,为None时显示所有列。
display.expand_frame_repr  输出数据宽度超过设置宽度时,表示是否对其要折叠,False不折叠,True要折叠。
display.max_colwidth       单列数据宽度,以字符个数计算,超过时用省略号表示。
display.precision          设置输出数据的小数点位数。
display.width              数据显示区域的宽度,以总字符数计算。
display.show_dimensions    当数据量大需要以truncate(带引号的省略方式)显示时,该参数表示是否在最后显示数据的维数,默认 True 显示,False 不显示。

# 显示最大列宽pd.set_option('max_colwidth',200)

# 显示所有列 pd.set_option('display.max_columns', None)

# 显示所有行 pd.set_option('display.max_rows', None)

查找及选取数据

list1=list('12345')
list2=list('abcdef')
list3 = [[3,4,5,6,8,10],[2,3,5,1,9,11],[4,2,9,0,2,3],[14,12,19,10,12,13],[24,22,292,20,22,23]]
df1  = pd.DataFrame(list3,index=list1,columns=list2)   #索引为字符‘12345’
df2  = pd.DataFrame(list3,columns=list2)               #索引为数值12345
print("--------索引为字符‘12345’--------------")
print(df1)  
print("----------索引为数值12345---------------")
print(df2)
print("------loc['1']获取索引为字符'1'的行-----")
print(df1.loc['1'])
print("-------loc[1]获取索引为数字的行---------")
print(df2.loc[1])
print("---iloc[1]获取df1/2第2行(从0行算起)-----")
print(df1.iloc[1])
print("---------iloc[1]按列索引选取------------")
print(df2.iloc[1])
print("-------------df['c']按行范围选----------")
print(df1.b)
print(df['c'])
print("-------------df[0:2]按行切片------------")
print(df[0:2])
--------索引为字符‘12345’-------------
    a   b    c   d   e   f
1   3   4    5   6   8  10
2   2   3    5   1   9  11
3   4   2    9   0   2   3
4  14  12   19  10  12  13
5  24  22  292  20  22  23
----------索引为数值12345---------------
    a   b    c   d   e   f
0   3   4    5   6   8  10
1   2   3    5   1   9  11
2   4   2    9   0   2   3
3  14  12   19  10  12  13
4  24  22  292  20  22  23
------loc['1']获取索引为字符'1'的行-----
a     3
b     4
c     5
d     6
e     8
f    10
Name: 1, dtype: int64
-------loc[1]获取索引为数字的行---------
a     2
b     3
c     5
d     1
e     9
f    11
Name: 1, dtype: int64
---iloc[1]获取df1/2第2行(从0行算起)-----
a     2
b     3
c     5
d     1
e     9
f    11
Name: 2, dtype: int64
a     2
b     3
c     5
d     1
e     9
f    11
Name: 1, dtype: int64
-------------按列索引选取---------------
1     4
2     3
3     2
4    12
5    22
Name: b, dtype: int64
0      5
1      5
2      9
3     19
4    292
Name: c, dtype: int64
-------------按行范围选对---------------
   a  b  c  d  e   f
0  3  4  5  6  8  10
1  2  3  5  1  9  11
list1=list('12345')
list2=list('abcdef')
list3 = [[3,4,5,6,8,10],[2,3,5,1,9,11],[4,2,9,0,2,3],[14,12,19,10,12,13],[24,22,292,20,22,23]]
df1  = pd.DataFrame(list3,index=list1,columns=list2)   #索引为字符‘12345’
df2  = pd.DataFrame(list3,columns=list2)               #索引为数值12345
print("--------索引为字符‘12345’-------------")
print(df1)  
print("----------索引为数值12345---------------")
print(df2)
print(df1.shape)

print(df1.index)
print(df2.index)
print(df1.columns)
print('----------------')
print(df1.to_numpy())
print("----------------")
df2.values
--------索引为字符‘12345’-------------
    a   b    c   d   e   f
1   3   4    5   6   8  10
2   2   3    5   1   9  11
3   4   2    9   0   2   3
4  14  12   19  10  12  13
5  24  22  292  20  22  23
----------索引为数值12345---------------
    a   b    c   d   e   f
0   3   4    5   6   8  10
1   2   3    5   1   9  11
2   4   2    9   0   2   3
3  14  12   19  10  12  13
4  24  22  292  20  22  23
(5, 6)
Index(['1', '2', '3', '4', '5'], dtype='object')
RangeIndex(start=0, stop=5, step=1)
Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
----------------
[[  3   4   5   6   8  10]
 [  2   3   5   1   9  11]
 [  4   2   9   0   2   3]
 [ 14  12  19  10  12  13]
 [ 24  22 292  20  22  23]]
----------------
array([[  3,   4,   5,   6,   8,  10],
       [  2,   3,   5,   1,   9,  11],
       [  4,   2,   9,   0,   2,   3],
       [ 14,  12,  19,  10,  12,  13],
       [ 24,  22, 292,  20,  22,  23]], dtype=int64)

插入数据

# 采用insert方式插入列数据
a1 =[['john',2,5],['web',3,5],['fan',8,9]]
d1 =pd.DataFrame(a1,index=list('abc'),columns=['name','u1','u2'])
a2 =[['mary',9,3],['hanson',6,7],['jonson',18,2]]
d2 =pd.DataFrame(a2,index=list('def'),columns=['name','u1','u2'])
add =[23,8,10]
print(d1)
print('----------------------------')
print(d2)
print('----------------------------')
d1.insert(3,column='u3',value=add)    # 第一个参数表示插入在第3列
print(d1)
print('----------------------------')

# append 合并二个数据 其column需相同
d3 = d1._append(d2)
print(d3)
 name  u1  u2
a  john   2   5
b   web   3   5
c   fan   8   9
----------------------------
     name  u1  u2
d    mary   9   3
e  hanson   6   7
f  jonson  18   2
----------------------------
   name  u1  u2  u3
a  john   2   5  23
b   web   3   5   8
c   fan   8   9  10
----------------------------
     name  u1  u2    u3
a    john   2   5  23.0
b     web   3   5   8.0
c     fan   8   9  10.0
d    mary   9   3   NaN
e  hanson   6   7   NaN
f  jonson  18   2   NaN

删除数据

# 删除列数据
a1 =({'john':[2,3,5,10],'smith':[3,3,2,5],'tom':[8,7,2,2]})
df = pd.DataFrame(a1,index =list('abcd'))
print(df)
df.pop('tom')
print(df)
del df['john']
print(df)
print('----------------------------')
#删除行数据
print(df.drop('a')) 
john  smith  tom
a     2      3    8
b     3      3    7
c     5      2    2
d    10      5    2
   john  smith
a     2      3
b     3      3
c     5      2
d    10      5
   smith
a      3
b      3
c      2
d      5
----------------------------
   smith
b      3
c      2
d      5

常用属性和方法汇总

a1 =({'john':[2,3,5,10],'smith':[3,3,2,5],'tom':[8,7,2,2]})
df = pd.DataFrame(a1,index =list('abcd'))
print(df)
print('----------------------------')
print(df.T)                     #行和列进行交换,行和列转置
print('---------------------------行和列转置-')
print(df.axes)                  #返回一个行标签、列标签组成的列表
print('----------------------------行标签、列标签')

print(df.index)

print(df.columns)

print(df.values)


print(df.to_numpy)


print(df.dtypes)                #返回每一列的数据类型
print('----------------------------数据对象是否为空')
print(df.empty)                 #返回一个布尔值,判断输出的数据对象是否为空,若为 True 表示对象为空
print('----------------------------数据对象的维数')
print(df.ndim)                  #返回数据对象的维数。DataFrame 是一个二维数据结构。
print('---------------------------DataFrame 维度-')
print(df.shape)                 #返回一个代表 DataFrame 维度的元组。返回值元组 (a,b),其中 a 表示行数,b 表示列数。
print('---------------------------元素数量')
print(df.size)                  #返回 DataFrame 中的元素数量
print('----------------------------DataFrame 中的数据')
print(df.values)                #以 ndarray 数组的形式返回 DataFrame 中的数据
print('---------------------------显示前2行的数据-')
print(df.head(2))                #head()&tail()查看数据
print('----------------------------')  
print(df.shift(periods=2,axis=0))
print('----------------------------')  
print(df.shift(periods=2,axis=1,fill_value= 10))
    # shift()移动行或列   DataFrame.shift(periods=1, freq=None, axis=0)  
    # peroids	类型为int,表示移动的幅度,可以是正数,也可以是负数,默认值为1。
    # freq	日期偏移量,默认值为None,适用于时间序。取值为符合时间规则的字符串。
    # axis	如果是 0 或者 "index" 表示上下移动,如果是 1 或者 "columns" 则会左右移动。
    # fill_value	该参数用来填充缺失值。
    
john  smith  tom
a     2      3    8
b     3      3    7
c     5      2    2
d    10      5    2
----------------------------
       a  b  c   d
john   2  3  5  10
smith  3  3  2   5
tom    8  7  2   2
---------------------------行和列转置-
[Index(['a', 'b', 'c', 'd'], dtype='object'), Index(['john', 'smith', 'tom'], dtype='object')]
----------------------------行标签、列标签
john     int64
smith    int64
tom      int64
dtype: object
----------------------------数据对象是否为空
False
----------------------------数据对象的维数
2
---------------------------DataFrame 维度-
(4, 3)
---------------------------元素数量
12
----------------------------DataFrame 中的数据
[[ 2  3  8]
 [ 3  3  7]
 [ 5  2  2]
 [10  5  2]]
---------------------------显示前2行的数据-
   john  smith  tom
a     2      3    8
b     3      3    7
----------------------------
   john  smith  tom
a   NaN    NaN  NaN
b   NaN    NaN  NaN
c   2.0    3.0  8.0
d   3.0    3.0  7.0
----------------------------
   john  smith  tom
a    10     10    2
b    10     10    3
c    10     10    5
d    10     10   10

内置迭代方法

#遍历 DataFrame 的每一行 
a1 =({'john':[2,3,5,10],'smith':[3,3,2,5],'tom':[8,7,2,2]})
df = pd.DataFrame(a1,index =list('abcd'))
print(df)
print('\n')
#1) iteritems():以键值对 (key,value) 的形式遍历;
for key,value in df.iteritems():
    print(key,value)
print('----------------------------')  
#2) iterrows():以 (row_index,row) 的形式遍历行;
for row_index,row in df.iterrows():
    print (row_index,row)
print('----------------------------')  
#3) itertuples():使用已命名元组的方式对行遍历
for row in df.itertuples():
    print(row)
john  smith  tom
a     2      3    8
b     3      3    7
c     5      2    2
d    10      5    2


john a     2
b     3
c     5
d    10
Name: john, dtype: int64
smith a    3
b    3
c    2
d    5
Name: smith, dtype: int64
tom a    8
b    7
c    2
d    2
Name: tom, dtype: int64
----------------------------
a john     2
smith    3
tom      8
Name: a, dtype: int64
b john     3
smith    3
tom      7
Name: b, dtype: int64
c john     5
smith    2
tom      2
Name: c, dtype: int64
d john     10
smith     5
tom       2
Name: d, dtype: int64
----------------------------
Pandas(Index='a', john=2, smith=3, tom=8)
Pandas(Index='b', john=3, smith=3, tom=7)
Pandas(Index='c', john=5, smith=2, tom=2)
Pandas(Index='d', john=10, smith=5, tom=2)
#各种遍历方式用时对比:
def df_sample():
    a1 = np.random.uniform(1,1000,30000)
    a2 = np.random.uniform(1,1000,30000)
    a3 = np.random.uniform(1,1000,30000)
    a4 = np.random.uniform(1,1000,30000)
    df = pd.DataFrame({'s1':a1,'s2':a2, 's3': a3, 's4': a4, 's5': None})
    return df

def iterate_1(dataframe):
    for i in range(len(dataframe)):
        dataframe.iloc[i,4] = dataframe.iloc[i,0] + dataframe.iloc[i,1]
     
def iterate_2(dataframe):
    for i in range(len(dataframe)):
        dataframe.iat[i,4] = dataframe.iat[i,0] + dataframe.iat[i,1]
       
def iterate_3(dataframe):
    for index,rows in dataframe.iterrows():
        rows['s5'] = rows['s1'] + rows['s2']
    
def iterate_4(dataframe):
    dataframe['s5'] = dataframe.apply(lambda x:x.s1 +x.s2, axis = 1)
    
def iterate_5(dataframe):
    dataframe['s5'] = dataframe[['s1','s2']].apply(lambda x:x.s1 +x.s2, axis = 1)
    
def iterate_6(dataframe):
    dataframe['s5'] = [a + b for a,b in zip(dataframe['s1'],dataframe['s2'])]   
    
def iterate_7(dataframe):
    dataframe['s5'] = dataframe['s1'] + dataframe['s2']   
    
def iterate_8(dataframe):
    dataframe['s5'] = dataframe['s1'].values + dataframe['s2'].values   


df = df_sample()  
%timeit iterate_1(df)
df = df_sample()  
%timeit iterate_2(df)
df = df_sample()  
%timeit iterate_3(df)
df = df_sample()  
%timeit iterate_4(df)
df = df_sample()  
%timeit iterate_5(df)
df = df_sample()   
%timeit iterate_6(df)
df = df_sample()   
%timeit iterate_7(df)
df = df_sample()  
%timeit iterate_8(df)
1.6 s ± 20.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
684 ms ± 24.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
960 ms ± 12.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
255 ms ± 5.02 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
258 ms ± 5.54 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
4.81 ms ± 146 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
142 µs ± 9.94 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
74.4 µs ± 7.81 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

索引及排序

按标签排序和按数值排序

#标签排序
#使用 sort_index() 方法对行标签排序,指定轴参数(axis)或者排序顺序。或者可以对 DataFrame 进行排序
unsorted_df = pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],columns = ['col2','col1'])
sorted_df=unsorted_df.sort_index(ascending=False)
print(sorted_df)
 col2      col1
9  0.444369 -1.697888
8  0.070220  0.390137
7 -0.583545  0.919181
6  0.422157 -1.009720
5 -1.790309 -0.826443
4  1.230016  0.196717
3  0.416548  0.784816
2  0.946949 -0.676896
1 -0.648799  0.688239
0 -1.166974  0.420939
#sort_values() 表示按值排序。它接受一个by参数
import pandas as pd
import numpy as np
unsorted_df = pd.DataFrame({'col1':[2,1,1,1],'col2':[1,3,2,4]})
sorted_df = unsorted_df.sort_values(by='col1')
print (sorted_df)
col1  col2
1     1     3
2     1     2
3     1     4
0     2     1

重置行列标签

#重置行、列索引标签
    #重置索引(reindex)可以更改原 DataFrame 的行标签或列标签,并使更改后的行、列标签与 DataFrame 中的数据逐一匹配
    #通过重置索引操作,您可以完成对现有数据的重新排序
    #如果重置的索引标签在原 DataFrame 中不存在,那么该标签对应的元素值将全部填充为 NaN
a1 =({'john':[2,3,5,10],'smith':[3,3,2,5],'tom':[8,7,2,2]})
df = pd.DataFrame(a1,index =list('abcd'))
print(df)
print('\n')
df1 = df.reindex(index=['c','a'],columns=['tom','smith','tony'])
print(df1)
john  smith  tom
a     2      3    8
b     3      3    7
c     5      2    2
d    10      5    2

   tom  smith  tony
c  2.0    2.0   NaN
a  8.0    3.0   NaN

重命名标签_rename

# rename() 方法允许使用某些映射(dict或Series)或任意函数来对行、列标签重新命名
a1 =({'john':[2,3,5,10],'smith':[3,3,2,5],'tom':[8,7,2,2]})
df = pd.DataFrame(a1,index =list('abcd'))
print(df)
print('\n')
df1 = df.rename(columns={'john':'john_ren','smith':'smith_ren'},index={'b':"b_ren"})
print(df1)
     john  smith  tom
a     2      3    8
b     3      3    7
c     5      2    2
d    10      5    2

       john_ren  smith_ren  tom
a             2          3    8
b_ren         3          3    7
c             5          2    2
d            10          5    2

重置索引_reset_index

#reset_index()在获得新的index,使用参数 drop=True不保留原来的index,默认 False原来的index变成数据列,保留下来

a1 =[['john',2,5],['web',3,5],['fan',8,9]]
d1 =pd.DataFrame(a1,columns=['name','u1','u2'])
a2 =[['mary',9,3],['hanson',6,7],['jonson',18,2]]
d2 =pd.DataFrame(a2,columns=['name','u1','u2'])
print(d1)
print(d2)
print('\n')
d3 =d2.append(d1)
print(d3)
print('----------------------------')  
d3 = d3.reset_index(drop=True)
print(d3)
    name   u1   u2
0   john    2   5
1   web     3   5
2   fan     8   9
     name   u1  u2
0    mary   9   3
1   hanson  6   7
2  jonson  18   2


     name  u1  u2
0    mary   9   3
1  hanson   6   7
2  jonson  18   2
0    john   2   5
1     web   3   5
2     fan   8   9
----------------------------
     name  u1  u2
0    mary   9   3
1  hanson   6   7
2  jonson  18   2
3    john   2   5
4     web   3   5
5     fan   8   9

设置索引

#set_index() 将已存在的列标签设置为 DataFrame 行索引、替换已经存在的索引

a1 =({'john':[2,3,5,10],'smith':[3,3,2,5],'tom':[8,7,2,2]})
df = pd.DataFrame(a1,index =list('abcd'))
print(df)
print('\n')
df.set_index('john')
john  smith  tom
a     2      3    8
b     3      3    7
c     5      2    2
d    10      5    2

Out[157]:
smithtom
john
238
337
522
1052

 merge合并操作

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,left_index=False, right_index=False, sort=True,suffixes=('_x', '_y'), copy=True)
    left/right    两个不同的 DataFrame 对象。
    on    指定用于连接的键(即列标签的名字),该键必须同时存在于左右两个 DataFrame 中,如果没有指定,并且其他参数也未指定, 那么将会以 
    两个 DataFrame 的列名交集做为连接键。
    left_on    指定左侧 DataFrame 中作连接键的列名。该参数在左、右列标签名不相同,但表达的含义相同时非常有用。
    right_on    指定左侧 DataFrame 中作连接键的列名。
    left_index    布尔参数,默认为 False。如果为 True 则使用左侧 DataFrame 的行索引作为连接键,若 DataFrame 具有多层
    索引(MultiIndex),则层的数量必须与连接键的数量相等。
    right_index    布尔参数,默认为 False。如果为 True 则使用左侧 DataFrame 的行索引作为连接键。
    how    要执行的合并类型,从 {'left', 'right', 'outer', 'inner'} 中取值,默认为“inner”内连接。
    sort    布尔值参数,默认为True,它会将合并后的数据进行排序;若设置为 False,则按照 how 给定的参数值进行排序。
    suffixes    字符串组成的元组。当左右 DataFrame 存在相同列名时,通过该参数可以在相同的列名后附加后缀名,默认为('_x','_y')。
    copy    默认为 True,表示对数据进行复制。

concat连接操作

pd.concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False)
    objs    一个序列或者是Series、DataFrame对象。
    axis    表示在哪个轴方向上(行或者列)进行连接操作,默认 axis=0 表示行方向。
    join    指定连接方式,取值为{"inner","outer"},默认为 outer 表示取并集,inner代表取交集。
    ignore_index    布尔值参数,默认为 False,如果为 True,表示不在连接的轴上使用索引。
    join_axes    表示索引对象的列表。

a1 =[['john',2,5],['web',3,5],['fan',8,9]]
d1 =pd.DataFrame(a1,columns=['name','u1','u2'],index=[1,2,3,])
a2 =[['mary',9,3],['hanson',6,7],['jonson',18,2]]
d2 =pd.DataFrame(a2,columns=['name','u1','u2'],index =[2,3,4])
a3 =[['mary',2],['hanson',7],['jonson',1]]
d3 =pd.DataFrame(a3,columns=(['name','u3']),index=[2,3,4])

print(d1)
print(d2)
print(d3)
print('\n')
print(pd.concat([d1,d2]).reset_index(drop=True))
print(pd.concat([d1,d2],ignore_index=True))
print('\n')

print(pd.concat([d2,d3],axis=1,join='inner',ignore_index=False))
name  u1  u2
1  john   2   5
2   web   3   5
3   fan   8   9
     name  u1  u2
2    mary   9   3
3  hanson   6   7
4  jonson  18   2
     name  u3
2    mary   2
3  hanson   7
4  jonson   1


     name  u1  u2
0    john   2   5
1     web   3   5
2     fan   8   9
3    mary   9   3
4  hanson   6   7
5  jonson  18   2
     name  u1  u2
0    john   2   5
1     web   3   5
2     fan   8   9
3    mary   9   3
4  hanson   6   7
5  jonson  18   2


     name  u1  u2    name  u3
2    mary   9   3    mary   2
3  hanson   6   7  hanson   7
4  jonson  18   2  jonson   1

join合并

d1=pd.DataFrame({'A':['A0','A1'],'B':['B0','B1']},index=['a','b'])
d2=pd.DataFrame({'C':['C0','C1'],'D':['D0','D1']},index=['c','d'])
d3=pd.DataFrame({'E':['E0','E1','E2'],'F':['F0','F1','F2'],'G':['G0','G1','G2']},index=list('abc'))
d4=pd.DataFrame({'G':['C0','C1'],'D':['D0','D1']},index=['c','d'])
print('---d1--------------------')
print(d1)
print('---d2--------------------')
print(d2)
print('---d3--------------------')
print(d3)
print('---d4--------------------')
print(d4)
print("")
print("-------d1.join(d2,how='left')-------------------")
print(d1.join(d2,how='left'))
print("-------d1.join(d2,how='right')-------------------")
print(d1.join(d2,how='right'))
print("-------d1.join(d3,how='right')-------------------")
print(d1.join(d3,how='left'))
print("-------d3.join(d1,how='outer)-------------------")
print(d3.join(d1,how='outer'))
print("-------d3.join(d1,how='inner)-------------------")
print(d3.join(d1,how='inner'))
print("-------d3.join(d1,how='outer)-------------------")
print(d3.join(d1['B'],how='outer'))
print("-------d3.join(d1,how='outer)-------------------")
print(d3.join(d4['D'],how='outer'))
print("-------d3.join(d1,how='left)-------------------")
print(d4.join(d3['E'],how='left'))
---d1--------------------
    A   B
a  A0  B0
b  A1  B1
---d2--------------------
    C   D
c  C0  D0
d  C1  D1
---d3--------------------
    E   F   G
a  E0  F0  G0
b  E1  F1  G1
c  E2  F2  G2
---d4--------------------
    G   D
c  C0  D0
d  C1  D1

-------d1.join(d2,how='left')-------------------
    A   B    C    D
a  A0  B0  NaN  NaN
b  A1  B1  NaN  NaN
-------d1.join(d2,how='right')-------------------
     A    B   C   D
c  NaN  NaN  C0  D0
d  NaN  NaN  C1  D1
-------d1.join(d3,how='right')-------------------
    A   B   E   F   G
a  A0  B0  E0  F0  G0
b  A1  B1  E1  F1  G1
-------d3.join(d1,how='outer)-------------------
    E   F   G    A    B
a  E0  F0  G0   A0   B0
b  E1  F1  G1   A1   B1
c  E2  F2  G2  NaN  NaN
-------d3.join(d1,how='inner)-------------------
    E   F   G   A   B
a  E0  F0  G0  A0  B0
b  E1  F1  G1  A1  B1
-------d3.join(d1,how='outer)-------------------
    E   F   G    B
a  E0  F0  G0   B0
b  E1  F1  G1   B1
c  E2  F2  G2  NaN
-------d3.join(d1,how='outer)-------------------
     E    F    G    D
a   E0   F0   G0  NaN
b   E1   F1   G1  NaN
c   E2   F2   G2   D0
d  NaN  NaN  NaN   D1
-------d3.join(d1,how='left)-------------------
    G   D    E
c  C0  D0   E2
d  C1  D1  NaN

统计性描述

frame = pd.DataFrame(np.random.randn(1000, 5),
   ....:                      columns=['a', 'b', 'c', 'd', 'e'])
print(frame)
frame.describe()
abcde
count1000.0000001000.0000001000.0000001000.0000001000.000000
mean-0.0124330.017818-0.0022370.0455920.004731
std0.9565650.9855821.0129731.0045130.985172
min-2.512181-3.011423-3.082391-3.350117-3.276499
25%-0.711675-0.666165-0.675890-0.633904-0.679420
50%-0.0730870.044573-0.0182960.067337-0.047563
75%0.6041050.7248160.6910150.7048700.703942
max3.2508212.8459043.6255963.3512482.620156

data = {'name' : pd.Series(['Alice', 'Bob', 'Cathy', 'Dany', 'Ella', 'Ford', 'Gary', 'Ham', 'Ico', 'Jack']),
        'Math_A' : pd.Series([1.1, 2.2, 3.3, 4.4, 5, 3.2, 2.4, 1.5, 4.3, 4.5]),
        'English_A' : pd.Series([3, 2.6, 2, 1.7, 3, 3.3, 4.4, 5, 3.2, 2.4]),
        'Math_B' : pd.Series([1.7, 2.5, 3.6, 2.4, 5, 2.2, 3.3, 4.4, 1.5, 4.3]),
        'English_B' : pd.Series([5, 2.6, 2.4, 1.3, 3, 3.6, 2.4, 5, 2.2, 3.1]),
        'Project_num' : pd.Series([2, 3, 0, 1, 7, 2, 1, 5, 3, 4]),
        'Sex' : pd.Series(['F', 'M', 'M', 'F', 'M', 'F', 'M', 'M', 'F', 'M'])
     }
df = pd.DataFrame(data)
print(df)
print('-------------------统计行数---------------------')
print(len(df))
print('-------------统计有多少种不同的值---------------')
print(df['Sex'].nunique())
print('------------列中每种不同的值进行计数 -----------')
print(df['Sex'].value_counts())
print('---------------整体统计描述 --------------------')
print(df.describe())
print(df.describe(include='all'))
print('---------------对指定的列整体统计 --------------')
print(df.Math_A.describe())
print('---------------------指定求合 ------------------')
print(df.Project_num.sum())
print('---------------------指定计数 ------------------')
print(df.count())
print('---------------------指定中位数 ----------------')
print(df.median())
print('---------------------指定分位数 ----------------')
print(df.quantile([0.25,0.75]))
print('-------------------最大值/最小值 ---------------')
print(df.max())
print(df.min())
print('---------------------均值 ----------------------')
print(df.mean())
print('----------------方差 / 标准差 ------------------')
print(df.var())
print(df.std())
  name  Math_A  English_A  Math_B  English_B  Project_num Sex
0  Alice     1.1        3.0     1.7        5.0            2   F
1    Bob     2.2        2.6     2.5        2.6            3   M
2  Cathy     3.3        2.0     3.6        2.4            0   M
3   Dany     4.4        1.7     2.4        1.3            1   F
4   Ella     5.0        3.0     5.0        3.0            7   M
5   Ford     3.2        3.3     2.2        3.6            2   F
6   Gary     2.4        4.4     3.3        2.4            1   M
7    Ham     1.5        5.0     4.4        5.0            5   M
8    Ico     4.3        3.2     1.5        2.2            3   F
9   Jack     4.5        2.4     4.3        3.1            4   M
-------------------统计行数---------------------
10
-------------统计有多少种不同的值---------------
2
------------列中每种不同的值进行计数 -----------
M    6
F    4
Name: Sex, dtype: int64
---------------整体统计描述 --------------------
          Math_A  English_A     Math_B  English_B  Project_num
count  10.000000  10.000000  10.000000  10.000000    10.000000
mean    3.190000   3.060000   3.090000   3.060000     2.800000
std     1.355196   1.014561   1.211473   1.189958     2.097618
min     1.100000   1.700000   1.500000   1.300000     0.000000
25%     2.250000   2.450000   2.250000   2.400000     1.250000
50%     3.250000   3.000000   2.900000   2.800000     2.500000
75%     4.375000   3.275000   4.125000   3.475000     3.750000
max     5.000000   5.000000   5.000000   5.000000     7.000000
         name     Math_A  English_A     Math_B  English_B  Project_num  Sex
count      10  10.000000  10.000000  10.000000  10.000000    10.000000   10
unique     10        NaN        NaN        NaN        NaN          NaN    2
top     Alice        NaN        NaN        NaN        NaN          NaN    M
freq        1        NaN        NaN        NaN        NaN          NaN    6
mean      NaN   3.190000   3.060000   3.090000   3.060000     2.800000  NaN
std       NaN   1.355196   1.014561   1.211473   1.189958     2.097618  NaN
min       NaN   1.100000   1.700000   1.500000   1.300000     0.000000  NaN
25%       NaN   2.250000   2.450000   2.250000   2.400000     1.250000  NaN
50%       NaN   3.250000   3.000000   2.900000   2.800000     2.500000  NaN
75%       NaN   4.375000   3.275000   4.125000   3.475000     3.750000  NaN
max       NaN   5.000000   5.000000   5.000000   5.000000     7.000000  NaN
---------------对指定的列整体统计 --------------
count    10.000000
mean      3.190000
std       1.355196
min       1.100000
25%       2.250000
50%       3.250000
75%       4.375000
max       5.000000
Name: Math_A, dtype: float64
---------------------指定求合 ------------------
28
---------------------指定计数 ------------------
name           10
Math_A         10
English_A      10
Math_B         10
English_B      10
Project_num    10
Sex            10
dtype: int64
---------------------指定中位数 ----------------
Math_A         3.25
English_A      3.00
Math_B         2.90
English_B      2.80
Project_num    2.50
dtype: float64
---------------------指定分位数 ----------------
      Math_A  English_A  Math_B  English_B  Project_num
0.25   2.250      2.450   2.250      2.400         1.25
0.75   4.375      3.275   4.125      3.475         3.75
-------------------最大值/最小值 ---------------
name           Jack
Math_A          5.0
English_A       5.0
Math_B          5.0
English_B       5.0
Project_num       7
Sex               M
dtype: object
name           Alice
Math_A           1.1
English_A        1.7
Math_B           1.5
English_B        1.3
Project_num        0
Sex                F
dtype: object
---------------------均值 ----------------------
Math_A         3.19
English_A      3.06
Math_B         3.09
English_B      3.06
Project_num    2.80
dtype: float64
----------------方差 / 标准差 ------------------
Math_A         1.836556
English_A      1.029333
Math_B         1.467667
English_B      1.416000
Project_num    4.400000
dtype: float64
Math_A         1.355196
English_A      1.014561
Math_B         1.211473
English_B      1.189958
Project_num    2.097618
dtype: float64

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

weixin_51303362

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

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

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

打赏作者

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

抵扣说明:

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

余额充值