【问题标题】:Process subset of data based on variable type in python在python中根据变量类型处理数据子集
【发布时间】:2018-11-08 22:29:21
【问题描述】:

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

df_data_sample:

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

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 中的代码能否实现这一点,也不确定这是否真的会加快进程。 谁能帮帮我!

【问题讨论】:

  • 你为什么不一次读入坑的csv文件呢?
  • 你好@P.Tillmann .. 这会占用大量内存并且其他脚本运行失败。谢谢!

标签: python list pandas


【解决方案1】:

对于数字列很简单:

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)

不幸的是,在块中存在问题进程get_dummies

【讨论】:

    【解决方案2】:

    我建议您加快计算速度的三件事:

    1. 看看 pandas HDF5 的能力。 HDF是一个二进制文件 用于快速读取数据并将数据写入磁盘的格式。
    2. 我会一次读取更大的 csv 文件块(几列)(取决于 你的内存有多大)。
    3. 您可以一次对每一列应用许多 pandas 操作。例如 nunique() (给你唯一值的数量,所以你不需要 unique().size)。通过这些按列操作,您可以通过使用二进制向量进行选择来轻松过滤列。例如
    df = df.loc[:, df.nunique() > 100] 
    #filter out every column where less then 100 unique values are present
    

    此外,pandas 作者关于大数据工作流的answer 可能对您来说很有趣。

    【讨论】:

    • 非常感谢@P.Tillmann。我一定会更详细地查看您分享的链接。乍一看似乎很有信息量。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 2021-01-25
    • 2023-03-17
    相关资源
    最近更新 更多