除循环外,还可以使用其他方法来估算此列吗?

时间:2019-07-26 08:31:13

标签: python pandas

我有一个时间序列数据,并使用fastai.collab模块在​​其中添加了一些功能。它添加的功能之一是Dayofweek。我正在手动尝试添加另一个功能,该功能将称为Weekend,它将是一个二进制列-如果Dayofweek的计算结果为false,则为0,否则它将得到1。该过程确实是很简单,但是标准程序要花很多时间(要等待40分钟以上)。我已经尝试过了:

print(data.columns)
Index(['shop_id', 'item_id', 'item_price', 'item_cnt_day', 'item_category_id',
       'Year', 'Month', 'Week', 'Day', 'Dayofweek', 'Dayofyear',
       'Is_month_end', 'Is_month_start', 'Is_quarter_end', 'Is_quarter_start',
       'Is_year_end', 'Is_year_start', 'weekend'],
      dtype='object')

data['Weekend'] = 0
for row in range(0, len(data)):
    if data['Dayofweek'][row] == 5 or data['Dayofweek'][row] == 6:
       data['Weekend'] = 1
    else:
       data['Weekend'] = 0

关于功能估算的模块很多,但不确定在此使用哪个模块。我可以对这些列进行子集并创建一个新表,然后在新表上再次尝试循环,然后将其粘贴回data,但是我认为应该有更好的方法。桌子很大(2935849,19),所以这可以解释这里的效率低下。

1 个答案:

答案 0 :(得分:3)

尝试坚持使用pandas自己的方法以提高效率。这是一个建议:

data['Weekend'] = data['Dayofweek'].ge(5).astype(int)

请注意,如果内存效率是一个问题,则最好将其转换为内存效率更高(即更小)的整数类型。您的情况的最佳选择是np.int8,它只是一个字节:

data['Weekend'] = data['Dayofweek'].ge(5).astype(np.int8)

这占用与boolean相同的内存量。具有1000000行的DataFrame的示例。首先作为布尔值供参考:

df = pd.DataFrame()
df['Dayofweek'] = np.random.randint(0, 7, 10**6)
df['Dayofweek'].max()
df['Weekend'] = df['Dayofweek'].ge(5)
df['Weekend'].memory_usage()

输出:

1000080

现在为整数:

df['Weekend'] = df['Dayofweek'].ge(5).astype(int)
df['Weekend'].memory_usage()

输出:

4000080

与布尔值情况有很大的不同。 现在np.int8(字节):

df['Weekend'] = df['Dayofweek'].ge(5).astype(np.int8)
df['Weekend'].memory_usage()

输出:

1000080