zoukankan      html  css  js  c++  java
  • Pandas Series和DataFrame的基本概念

    1,创建Series

    1.1,通过iterable创建Series

    Series接收参数是Iterable,不能是Iterator

    pd.Series(Iterable)

    可以多加一个index参数,index可以接收Iterator或者Iterable:

    >>> pd.Series(('a', 'b'), index=iter(range(2)))
    0    a
    1    b
    dtype: object

    1.2,通过字典创建Series

    key是索引:

    >>> pd.Series({'a':1, 'b':2})
    a    1
    b    2
    dtype: int64
    

    2,Series常用方法

    s = pd.Series([1, 2, 3], index=list('abc'))

    Series也能像字典那样遍历:

    for index, value in s.items():
        print(index, value, end=';')  # a 1;b 2;c 3;

    和字典一样,Series的in测试默认是index操作,如果想对values操作需加上values:

    print('a' in s)   # True
    print(1 in s.values)  # True

    获取series的values组成的列表:

    print(s.tolist())   # [1, 2, 3]
    

      

    3,创建DataFrame

    3.1,通过iterable组成的列表创建DataFrame

    [it1, it2, ..., itN],每个it是一行数据,缺省的index, columns是从0开始的int

    >>> pd.DataFrame([(1, 2, 3), [4, 5, 6], range(3, 6), 'abc'])
       0  1  2
    0  1  2  3
    1  4  5  6
    2  3  4  5
    3  a  b  c

    it长度不等时会自动用NaN或者None填充:

    >>> pd.DataFrame([(1, 2), [4, 5], range(3, 6), 'abc'])
       0  1     2
    0  1  2  None
    1  4  5  None
    2  3  4     5
    3  a  b     c
    >>> pd.DataFrame([(1, 2, 3), [4, 5, 6], range(3, 6), 'ab'])
       0  1    2
    0  1  2  3.0
    1  4  5  6.0
    2  3  4  5.0
    3  a  b  NaN

    指定index和columns:

    >>> pd.DataFrame([(1, 2, 3), [4, 5, 6], range(3, 6), 'abc'], index=range(4), columns=list('ABC'))
       A  B  C
    1  1  2  3
    2  4  5  6
    3  3  4  5
    4  a  b  c
    

    3.2,通过numpy矩阵创建DataFrame

    np_data = np.random.random((3, 4))
    np_data = np.arange(12).reshape(3, 4)
    np_data = np.ones((3, 4))
    df = pd.DataFrame(np_data)
    

    3.3,通过“一键多值”创建DataFrame

    创建dataframe,键是列名:

    >>> pd.DataFrame({'a':[1, 2, 3], 'b': [4, 5, 6]})     
       a  b
    0  1  4
    1  2  5
    2  3  6
    

    可以设置index:

    >>> pd.DataFrame({'a':[1, 2, 3], 'b': [4, 5, 6]}, index=list('456'))
       a  b
    4  1  4
    5  2  5
    6  3  6

    创建df时更改columns会出问题:

    >>> pd.DataFrame({'a':[1, 2, 3], 'b': [4, 5, 6]}, columns=list('AB'))
    Empty DataFrame
    Columns: [A, B]
    Index: []

    这种创建方法可以看做是按列创建df,需要事先建很多列表,最后一次性赋给df

    3.4,通过“字典列表”创建DataFrame

    pd.DataFrame([{'a':1 , 'b': 4},  {'a':2 , 'b': 5},  {'a':3 , 'b': 6}]) 
       a  b
    0  1  4
    1  2  5
    2  3  6
    

    这种方法只需要创建一个列表,然后不停往该列表里添加字典即可,推荐!

    3.5,df.loc,df.iloc,df.ix等逐行/逐单元格创建DataFrame

    事先创建好dataframe,然后用dfdf.loc,df.iloc,df.ix逐行逐单元格增加数据,例如:

    df = pd.DataFrame()
    for index, item in enumerate(zip('abcde', range(5))):
        df.loc[index, 'A'] = item[0]
        df.loc[index, 'B'] = item[1]

    效率非常低,不推荐

    4,SettingWithCopyWarning

    对DataFrame的弱引用对象进行拷贝进行赋值会触发SettingWithCopyWarning。

    通过bool序列筛选拿到的是dataframe的弱引用对象。对弱引用对象进行修改时,不会影响到原来的dataframe。

    >>>df = pd.DataFrame(np.arange(16).reshape(4, 4), columns=list('ABCD'))
    >>>df1 = df[df['B'] > 2]
    >>>df1.is_copy
    <weakref at 0x08B5F6C0; to 'DataFrame' at 0x00CC5070>
    >>>df1['A'] = 0
    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
    >>>df1  # df1会改变
       A   B   C   D
    1  0   5   6   7
    2  0   9  10  11
    3  0  13  14  15
    >>>df  # df不会改变
        A   B   C   D
    0   0   1   2   3
    1   4   5   6   7
    2   8   9  10  11
    3  12  13  14  15
    

    df1是df的弱引用拷贝,对df1进行赋值会触发SettingWithCopyWarning。

    如果df1 = df.copy()不会触发该警告。

    另外,如果是获取一个列,则拿到的是视图,并不是弱引用,对该视图进行的修改会反映到源dataframe:

    >>>df = pd.DataFrame(np.arange(12).reshape(3, 4), columns=list('ABCD'))
    >>>a = df['A']
    >>>a.loc[1] = 55
    >>>a
        A  B   C   D
    0   0  1   2   3
    1  55  5   6   7
    2   8  9  10  11
    

      

  • 相关阅读:
    Luogu P1131 时态同步
    Codeforces Round #507 B. Shashlik Cooking
    Codeforces Round #507 A. Palindrome Dance
    Luogu P3818 小A和uim之dark♂逃离 Ⅱ
    Luogu P1373 小a和uim之dark♂逃离 Ⅰ
    Luogu P4822 [BJWC2012]冻结
    Luogu P2575 高手过招(博弈论)
    Luogu P1074靶形数独
    Luogu P2323「皇后游戏」
    GodFly的寻宝之旅·状压DP
  • 原文地址:https://www.cnblogs.com/guxh/p/10294889.html
Copyright © 2011-2022 走看看