datawhale-动手学数据分析task3笔记

LPF05 / 2024-03-17 / 原文

动手学数据分析task3

数据重构

数据合并

  1. .concat()函数可以基于整体合并DF和Series,包括columns合并和index合并。

    '''
    参数说明:
    - objs=sequence/mapping,其元素是要合并的Dataframe或series
    - axis=0/1,沿着行/列合并
    - join='outer'/'inner',合并时索引对齐方式
    outer是单独拼接无改变(即index拼接时,index直接累加,而columns取并集,缺失值填充NaN),而inner是交联拼接(即index拼接时,index直接累加,而columns只保留交集的columns)
    - ignore_index=Bool,是否忽略掉原来的数据索引(即是否重新排序)
    - keys=None/sequence,合并DF后的index标签(即原index在DF合并后的index,与level相反,keys是分别的index而levels是合并的inex)
    - levels=None/sequence,合并需要合并的index后的index
    - names=None/list,为MultiIndex(多级索引)中的每个级别命名
    - verify_integrity=Bool,检查新连接的轴是否包含重复项
    - sort=Bool,True时,连接后的轴标签将根据字典顺序进行排序
    - copy=Bool,True时,会返回副本,False则返回原始数据
    '''
    
    # 以下有具体值的为默认值
    pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True)
    
  2. 当多个index和columns都需合并时,可以采取多次pd.concat()合并。

  3. .join()方法可以基于index键合并DF。

    '''
    参数说明:
    - other=Dataframe/Series,其是要合并的内容  
    - on=None/str/str list,指定合并columns,会基于on指定的columns进行合并DF,即保留指定的column中的相同value的index  
    - how='left'/'right'/'outer'/'inner'/'cross',连接方式,即使用指定DataFrame的index(合并后非指定DF),inner则是使用交集index,outer是使用并集index。  
    - lsuffix=''/str,即为left DF中交集的index加的后缀  
    - rsuffix=''/str,同上,但为right DF  
    - sort=Bool,True时,连接后的轴标签将根据字典顺序进行排序  
    - validate=None/'1:1'/'1:m'/'m:1'/'m:m',检查合并index是否有重复值,如果是'1:m'则允许right DF有重复index,其余同理  
    '''
    
    # 以下有具体值的为默认值
    df.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False, validate=None)
    
  4. .merge()函数是基于column键合并DF和Series。

    '''
    参数说明:
    - left=right=Dataframe/Series,其是要合并的内容  
    - how同上join
    - on同上join
    - left_on=None/str/str list,left DF指定合并columns,同on,但是是left_on与right_on替代了on  
    - left_index=Bool,如果True,则使用left DF的index作为合并键  
    - right_index=Bool,如果True,则使用right DF的index作为合并键  
    - sort同上join  
    - suffixes=(left_str, right_str),即为DF中交集的index分别加的后缀   
    - copy=Bool,True时,会返回副本,False则返回原始数据  
    - indicator=Bool/str,如果True,将添加一个名为_merge的列到输出DF中,显示每行数据的来源('left_only', 'right_only', 'both'),如果为字符串,则用作该列的列名
    - validate同上join 
    '''
    
    # 以下有具体值的为默认值
    pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=None, indicator=False, validate=None)
    
  5. .concat().join().merge()的区别:

    • .concat()函数偏重于沿着一个特定的轴连接两个或多个DF或Series对象。

    • .join()函数偏重于基于一个或多个index键合并两个DF对象(必须有合并的键),但on参数是可选的。

    • .merge()函数偏重于基于一个或多个columns键合并两个DF对象(必须有合并的键),但on参数是必需的(如果启用index作为合并键则不需要)。

    • .join().merge()要想实现.concat效果可以配合append方法。

有关数据和并部分方法的Blog可以参考:Pandas拼接操作与官方wiki

转变数据类型

  1. 可以用iloc将DF转化为series:

    for i in df.index:
        pf=result.iloc[i,:]
        pfs.append(pf)
    
  2. .stcak()方法可以将DF的列旋转成行,从而将DF转化为Series。

    '''
    参数说明:
    level=int/str,用于指定从哪个级别开始堆叠,-1即最内层级别
    dropna=Bool,是否删除结果中缺少值的行
    sort=Bool,是否排序index
    future_stack=Bool,是否使用新的stack方法
    '''
    
    # 以下有具体值的为默认值
    DataFrame.stack(level=-1, dropna=True, sort=True, future_stack=False)
    

数据聚合与运算

  1. Groupby用于将数据集按照一个或多个指定的column进行分组,并对每个分组应用某些操作或函数,从而得到每个分组的统计信息或其他计算结果。

  2. df[column1].groupby(df[column2])得到的结果是根据 column2 的值对 column1 的数据进行分组的情况。

    data = {  
        'salary': [50000, 60000, 45000, 70000, 55000, 65000],  
        'department': ['A', 'B', 'A', 'B', 'A', 'C']  
    }  
    df = pd.DataFrame(data)  
    

    3-1

    # 使用 groupby 对 salary 列按照 department 列进行分组,并计算平均值  
    df['salary'].groupby(df['department']).describe()
    

    3-2

  3. 通过.groupby()方法即可生成groupby类型对象。

    '''
    参数说明:
    by=None/column/columns,进行分组的column,多columns会按这些列的值的组合进行分组(多类分组),None不分组
    level=int/level name,如果columns是一个MultiIndex,则按照级别编号或名称分组
    sort=Bool,分组之前是否对数据进行排序
    group_keys=None/Bool,是否保留分组键
    observed=Bool,是否只显示实际观察到的类别
    dropna=Bool,是否删除不含任何数据的组
    '''
    
    # 以下有具体值的为默认值
    df.groupby(by=None, level=None, as_index=True, sort=False, group_keys=no_default, observed=True, dropna=True)
    
  4. 单类分组和多类分组。

    group = df.groupby(a)
    group = df.groupby([a, b])
    
  5. groupby类型的计算函数。

    group = df['Fare'].groupby(df[Sex])
    
    group.size()  # 输出:分Sex组的Sex数据
    group.mean()  # 输出:分Sex组后的Fare平均值