添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
ndarray、iterable、dict、DataFrame 用于构造DataFrame的数据(注意,用某个DataFrame构造另一个DataFrame,可能会导致同步修改的问题;如果要得到某个DataFrame的副本,可以用df.copy()) index Index或array 索引行,即第一行,通常为属性1,属性2,…… columns Index或array  索引列,即第一列,通常为0,1,2,……
 1 import pandas as pd
 3 person={
 4 'Name':["Braund,Mr.OwenHarris",
 5 "Allen,Mr.WilliamHenry",
 6 "Bonnell,Miss.Elizabeth",],
 7 'Age':[22,35,58],
 8 'Sex':["male","male","female"],
10 person_df=pd.DataFrame(person)
12 #显示出来
13 person_df
14     Name Age Sex
15 0 Braund,Mr.OwenHarris 22 male
16 1 Allen,Mr.WilliamHenry 35 male
17 2 Bonnell,Miss.Elizabeth 58 female

访问方式为:df.xxx

访问某一列:df.列名、df['列名'] 得到的是 Series 类型的数据

访问某一行:df.loc[行标签]、df.iloc[行号]

Series转List:list(ser)

改每列索引(第一行):df.columns = [A,B,C……]

改每行索引(第一列):df.index = [A,B,C,…… ] 或 df.set_index(...)

  • 单个label,如5、'a';必须是label中有的值,不能用数字代指某列
  • label的list,如['a' ,'b' , 'c'];
  • 切片,如 'a':'f'(从'a'到'f',a与f均包含), : (全部行)。
  • 与对应维度尺寸大小相同的boolean array,如[True , False , True]
  • alignable boolean Series
  • callable函数(只有一个输入参数且必须是Series或DataFrame类型),返回一个合法的以上所说的类型
  • 1)访问第2,3列

    df.iloc[:,[2,3]]

    访问某一列:df.列名、df['列名'] 得到的是 Series 类型的数据

    访问某一行:df.loc[行标签]、df.iloc[行号]

    df.loc[pd.Series([False, True, False],
           index=['viper', 'sidewinder', 'cobra'])]

    其中Series的index必须与DataFrame中对应维度的index相同,这等价于用法d直接写

    df.loc[[False, False, True]]

    对于使用callable函数的例子

    df.loc[lambda df : df ['shield'] ==8 ] #提取df中shield列==8的行

    4)取Series的一个值

    ser[4]:取ser的第五个值

    ②iloc

    与loc的区别在于,iloc只接受 整数值 (从0到length-1)和 boolean array

    接受的输入值:

  • 单个整数,如5;
  • 整数的list或array,如[ 4 , 3 , 0 ]
  • 整数切片,如1:7;也可以用冒号:,代表全部行/列
  • boolean array
  • callable函数,接受一个参数(Series或DataFrame),返回值为上文a到d中的类型
  • 如果想用 loc 提取某一列的最后一号元素,那么 loc[i,j] 中的 i 不能写为 -1 ,可以这样写:

    lastEle = df.loc[df.index[-1],column_name]

    ③访问某一列

    df.列名 df['列名'] 的方式访问某一列

    该方式只能访问一列,如果要访问多列请用上文①②讲的方法。

    2.5.3、返回DataFrame的array形式: values

    返回值类型为 numpy.ndarray

    只返回DataFrame中的值,而不返回label行和列。

    官方文档中推荐用 df.to_numpy() 代替。

    三种将 DataFrame 转化为 ndarray 的方法:

    #假设df是一个DataFrame
    #df→ndarray
    df_array=df.values
    df_array=df.to_numpy()
    df_array=np.array(df)

    2.5.4、检查DataFrame是否为空: empty

    df.empty :如果df.empty中没有任何元素,就会返回True

    用法为: df.xxx( ... )

    假设有一个 DataFrame df ,我们想把它的 'Time' 列设置为 Index

    df_new = df.set_index('Time',inplace=False)

    需要注意的是,如果参数inplace=False,那么并不是对df本身进行修改,而是 返回 一个 修改后的DataFrame ,所以需要用一个额外的变量承接 (如上文 df_new

    2)applymap

    对DataFrame中的 所有元素 使用某个函数,相当于对 list 使用 map 的用法

    把df中的所有0值设为Null

    df.applymap(lambda x:Null if x==0 else x)

    3)apply

    对DataFrame中每行/列的所有元素使用某个函数

    df.apply(
        func, axis=0, raw=False, result_type=None,
        args=(), **kwds
    应用于每一行/每一列的函数值
    

    0与'index'

    1与'columns'

    0:为每一列应用该函数

    1:为每一行应用该函数

    False

    决定传入的行与列是Series还是ndarray对象:

    False:Series

    True:ndarray

    result_type {'expand','reduce','broadcast',None}

    只用于axis=1

    'expand'结果会被加入到DataFrame的扩展列中

    'reduce'单独返回结果列

    'broadcast'结果保存为原DataFrame中,相当于用结果列替换原DataFrame中的列

    tuple 传入func的参数

    4)添加一列、一行

    assign

    如果只是执行df.assign,那么只会返回一个结果,不会在原df上起作用。

    因此要想把结果覆盖原DF,就要写成:

    df=df.assign(...)
    df_new = df.assign( 列名1 = Series、Array、List ,
           列名2 = Series、Array、List)

    参数中的列名n不需要加引号;Series、Array、List要和df长度一致

    假设已经有一个DataFrame df,有个长度与它相等Series S,我们要把S添加到df中,命名为'New_Column'

    df_new = df.assign( NewColumn=S )

    如果是对已有列进行运算得到的新列,可以用lambda匿名函数和df[列名]的结合,例如:

    df.assign(temp_f=lambda x: x['temp_c'] * 9 / 5 + 32,
              temp_k=lambda x: (x['temp_f'] +  459.67) * 5 / 9)

    append

    和assign一样,append的结果不会作用于原DataFrame。

    因此要想把结果覆盖原DF,就要写成:

    df=df.append(...)
    df_new = df.append(other, ignore_index=False, verify_integrity=False, sort=False)
    df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'), index=['x', 'y'])
    x  1  2
    y  3  4
    df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'), index=['x', 'y'])
    x  5  6
    y  7  8
    df.append(df2, ignore_index=True)
    0  1  2
    1  3  4
    2  5  6
    3  7  8

     如果报错TypeError: Can only append a Series if ignore_index=True or if the Series has a name,则需要加参数ignore_index=True

    5)between_time

    提取Index位于指定时间段内构成新的DataFrame

    注意,Index必须是DateTime类型(如何转化可以看Pandas:从CSV中读取一个含有datetime类型的DataFrame、单项时间数据获取

    df.between_time(
        start_time, end_time, include_start=True, 
        include_end=True, axis=None
    2018-04-09 00:00:00  1
    2018-04-10 00:20:00  2
    2018-04-11 00:40:00  3
    2018-04-12 01:00:00  4
    
    #筛选在此区间内的行 ts.between_time(
    '0:15', '0:45') 2018-04-10 00:20:00 2 2018-04-11 00:40:00 3
    #筛选不在此区间内的行 ts.between_time(
    '0:45', '0:15') 2018-04-09 00:00:00 1 2018-04-12 01:00:00 4

     6)interpolate

    用插值的方法填充NaN值。

    请注意,对于多重索引(MultiIndex)的DataFrame/Series,只支持用method='linear'的形式。

        df.interpolate(
            method='linear', axis=0, limit=None, inplace=False,
            limit_direction=None, limit_area=None, downcast=None, **kwargs
    
  • 'index'、'values':使用索引值作为待填充值;
  • 'pad':使用存在的值填充空值;
  • 'nearest'、'zero'、'slinear'、'quadratic'、'cubic'、'spline'、
  •    'barycentric'、'polynomial':最近邻、零值、...;

  • 'krogh'、‘piecewise_polynomial’, ‘spline’, ‘pchip’,
  •    ‘akima’, ‘cubicspline’:用SciPy中相应的插值方法;

  • 'from_derivatives':scipy.interpolate.BPoly.from_derivatives
  • 'linear' {0或'index'、1或'columns'、None} 沿着哪个方向插值 limit 最多填充的连续空值数 inplace False 是否替换原值 limit_direction {'forward'、'backward'、'both'}

    对于连续的空值,依照该参数说明的方向进行填充。

  • 如果指定参数'limit':如果插值方法是'pad'或'ffill',那么'limit_direction'必须是'forward';如果插值方法是'backfill'或'bfill',那么'limit_direction'必须是'backwards';
  • 如果未指定参数'limit':如果插值方法是'backfill'或'bfill',那么'limit_direction'默认是'backward';其他情况都是'forward'
  • Series、DataFrame、None

    如果inplace=True,那么返回None,原来的DataFrame中的空值被新值填充;如果inplace=False,那么返回一个填充后的Series、DataFrame

    1、什么参数都不写,用默认方式插值(即线性插值法——linear)

    s = pd.Series([0, 1, np.nan, 3])
    0    0.0
    1    1.0
    2    NaN
    3    3.0
    dtype: float64
    s.interpolate()
    0    0.0
    1    1.0
    2    2.0
    3    3.0
    dtype: float64

    2、padding插值,一次最多填充两个连续的空值

    s = pd.Series([np.nan, "single_one", np.nan,
                   "fill_two_more", np.nan, np.nan, np.nan,
                   4.71, np.nan])
    0 NaN
    1 single_one 2 NaN 3 fill_two_more 4 NaN 5 NaN 6 NaN 7 4.71 8 NaN dtype: object
    s.interpolate(method
    ='pad', limit=2) 0 NaN 1 single_one 2 single_one 3 fill_two_more 4 fill_two_more 5 fill_two_more 6 NaN 7 4.71 8 4.71 dtype: object

    3、用'forward'方式插值——空值用它前边的值替换:

    df = pd.DataFrame([(0.0, np.nan, -1.0, 1.0),
                       (np.nan, 2.0, np.nan, np.nan),
                       (2.0, 3.0, np.nan, 9.0),
                       (np.nan, 4.0, -4.0, 16.0)],
                      columns=list('abcd'))
         a    b    c     d
    0  0.0  NaN -1.0   1.0
    1  NaN  2.0  NaN   NaN
    2  2.0  3.0  NaN   9.0
    3  NaN  4.0 -4.0  16.0
    df.interpolate(method='linear', limit_direction='forward', axis=0)
         a    b    c     d
    0  0.0  NaN -1.0   1.0
    1  1.0  2.0 -2.0   5.0
    2  2.0  3.0 -3.0   9.0
    3  2.0  4.0 -4.0  16.0

    4、多项式插值——order指明多项式的次数

    df['d'].interpolate(method='polynomial', order=2)
    0     1.0
    1     4.0
    2     9.0
    3    16.0
    Name: d, dtype: float64

     7)drop

    从DataFrame中删除指定的行、列。

    df.drop(
        labels=None, axis=0, index=None, columns=None,
        level=None, inplace=False, errors='raise'
    
    df = pd.DataFrame(np.arange(12).reshape(3, 4),
                      columns=['A', 'B', 'C', 'D'])
       A  B   C   D
    0  0  1   2   3
    1  4  5   6   7
    2  8  9  10  11

    删除列/columns;

    df.drop(['B', 'C'], axis=1)
       A   D
    0  0   3
    1  4   7
    2  8  11
    df.drop(columns=['B', 'C'])
       A   D
    0  0   3
    1  4   7
    2  8  11

    删除行/index

    df.drop(index=[0, 1])
       A  B   C   D
    2  8  9  10  11

    注意,这里的index=[0,1]指的是删除索引为0,1的行,并非删除第0、1行。

    换言之,如果索引变成了"first,second",那么这里的写法就是index=["first","second"]

    删除/清空/clear所有行

    df.drop(index=df.index,inplace=True)

    删除根据条件删除其中的若干行

    可以先通过循环,把这些行的行号保存为list,再用df.drop(index=list)

    del_list=[]
    for i in range(data.shape[0]):
        if data.iloc(i,0)<3:
            del_list.append(data.index[i])
    data.drop(index=del_list,inplace=True)

     8)head、tail

    head(n):前n行
    tail(n):后n行

    不写n默认为5

    9)count与sum

    count:统计每列或每行非空值的个数

    sum:统计每列或者每行非空值的和

    使用count+sum的组合可以实现统计整个DF中非空值的个数:

    num=df.count().sum()

    count、sum默认是统计每列非空值,如果要统计每行,需要写成count(1)、sum(1)

    10)sort_values

    按照某列的值排序

    DataFrame.sort_values(by, *, axis=0, ascending=True, inplace=False,
     kind='quicksort', na_position='last', ignore_index=False, key=None)

    按照C列进行降序排序

    df.sort_values('C',ascending=False,inplace=True)

    如果没有inplace=True,那么排序不会作用于原DataFrame

    11)rename

    重命名标签行、标签列

    df.rename(columns={'old_name1':'new_name1','old_name2:new_name2'})#分别重命名各列
    df.rename(index={'old_name1':'new_name1','old_name2:new_name2'})#分别重命名各行

    如果不加参数inplace,则不会作用于原DF

    columns、index后必须跟dict类型或者某个可以作用于全部行/列的函数(例如str.lower就是把所有标签小写化)

    df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
    df.rename(columns={"A": "a", "B": "c"}) #将A列改名a,B列改名c
    0
    1 4 1 2 5 2 3 6
    df.rename(columns=str.lower)
    0 1 4 1 2 5 2 3 6