代码之家  ›  专栏  ›  技术社区  ›  Shuvayan Das

python中基于变量类型的数据处理子集

  •  4
  • Shuvayan Das  · 技术社区  · 6 年前

    我在csv(df_sample.csv)中存储了以下数据。我有一个名为cols_list的列表中的列名。

    数据样本:

    df_data_sample = pd.DataFrame({
                        'new_video':['BASE','SHIVER','PREFER','BASE+','BASE+','EVAL','EVAL','PREFER','ECON','EVAL'],
                        'ord_m1':[0,1,1,0,0,0,1,0,1,0],
                        'rev_m1':[0,0,25.26,0,0,9.91,'NA',0,0,0],
                        'equip_m1':[0,0,0,'NA',24.9,20,76.71,57.21,0,12.86],
                        'oev_m1':[3.75,8.81,9.95,9.8,0,0,'NA',10,56.79,30],
                        'irev_m1':['NA',19.95,0,0,4.95,0,0,29.95,'NA',13.95]
                        })
    
    attribute_dict = {
            'new_video': 'CAT',
            'ord_m1':'NUM',
            'rev_m1':'NUM',
            'equip_m1':'NUM',
            'oev_m1':'NUM',
            'irev_m1':'NUM'
            }
    

    然后我读了每一列,并做了如下数据处理:

    cols_list = df_data_sample.columns
    # Write to csv.
    df_data_sample.to_csv("df_seg_sample.csv",index = False)
    #df_data_sample = pd.read_csv("df_seg_sample.csv")
    #Create empty dataframe to hold final processed data for each income level.
    df_final = pd.DataFrame()
    # Read in each column, process, and write to a csv - using csv module
    for column in cols_list:
        df_column = pd.read_csv('df_seg_sample.csv', usecols = [column],delimiter = ',')
        if (((attribute_dict[column] == 'CAT') & (df_column[column].unique().size <= 100))==True):
            df_target_attribute = pd.get_dummies(df_column[column], dummy_na=True,prefix=column)
            # Check and remove duplicate columns if any:
            df_target_attribute = df_target_attribute.loc[:,~df_target_attribute.columns.duplicated()]
    
            for target_column in list(df_target_attribute.columns):
                # If variance of the dummy created is zero : append it to a list and print to log file.
                if ((np.var(df_target_attribute[[target_column]])[0] != 0)==True):
                    df_final[target_column] = df_target_attribute[[target_column]]
    
    
        elif (attribute_dict[column] == 'NUM'):
            #Let's impute with 0 for numeric variables:
            df_target_attribute = df_column
            df_target_attribute.fillna(value=0,inplace=True)
            df_final[column] = df_target_attribute
    

    属性“dict”是一个字典,包含变量名:变量类型的映射为:

    {
    'new_video': 'CAT'
    'ord_m1':'NUM'
    'rev_m1':'NUM'
    'equip_m1':'NUM'
    'oev_m1':'NUM'
    'irev_m1':'NUM'
    }
    

    但是,此逐列操作在**(500万行*3400列)**大小的数据集上运行需要很长时间。目前运行时间约为 12小时以上。 我想尽可能地减少这一点,我能想到的方法之一是一次处理所有num列,然后逐列执行。 对于CAT变量。 然而,我既不确定python中的代码是否能实现这一点,也不确定这是否会真正加快进程。 有人能帮我吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   jezrael    6 年前

    对于数字列,它很简单:

    num_cols = [k for k, v in attribute_dict.items() if v == 'NUM']
    print (num_cols)
    ['ord_m1', 'rev_m1', 'equip_m1', 'oev_m1', 'irev_m1']
    
    df1 = pd.read_csv('df_seg_sample.csv', usecols = [num_cols]).fillna(0)
    

    但是第一部分代码是性能问题,特别是在 get_dummies 要求 5 million rows :

    df_target_attribute = pd.get_dummies(df_column[column], dummy_na=True, prefix=column)
    

    不幸的是有问题的过程 获取虚拟对象 成堆的。

        2
  •  1
  •   P.Tillmann Zhongxia Yan    6 年前

    有三件事我建议你加快计算速度:

    1. 看看熊猫 HDF5 能力。hdf是一个二进制文件 用于快速读写数据到磁盘的格式。
    2. 我会一次读取csv文件的大块(几列)(取决于 你的记忆力有多大)。
    3. 您可以一次对每个列应用许多熊猫操作。例如nunique()(为您提供唯一值的数目,因此不需要unique().size)。通过这些列操作,您可以通过使用二进制向量进行选择来轻松筛选列。例如。
    df = df.loc[:, df.nunique() > 100] 
    #filter out every column where less then 100 unique values are present
    

    还有这个 answer 来自《大熊猫》的作者,关于大数据的工作流程可能对您很有意思。