使用python的pandas模块时,查找和修改dataFrame中的值速度非常慢,请问是什么原因,有什么好办法解决吗?
大家讲道理
大家讲道理 2017-04-17 17:53:21
0
4
963

最近在用pandas做一个机器学习的项目,训练集大概2G。我用的dataFrame来操作数据,对训练集做了一次groupby和mean的操作,速度还挺快的,但把得到的结果赋值给用户参数(也是一个dataframe表)的时候,速度缺特别慢,请问这是什么原因呢?
训练集大概有7000多万行,做groupby和mean操作大概十几分钟也就完成了,但赋值操作缺超级慢,每秒钟大概只能赋值50条左右,差距太大了。其中赋值语句大概是这样操作的:
dataframeA.loc[user,'']=dataframeB.loc[user,'']。两张dataFrame表都很大,都是百万级的,不知道是不是和量级较大有关,但千万级的训练集做groupby也没什么压力啊,而且这个机器学习项目,会经常使用和修改表中的参数,如果都这么慢的话,可能就无法正常使用了,哪位大神有什么好的解释或者建议吗?非常感谢了。部分代码如下,有什么细节没有说清楚的话可以问我,我再详细解释下。

def get_average_rating(self):
        self.u = log_train['Result'].mean()
        print 'u is ',self.u
        i,j = 0,0
        user_mean_rate = log_train.groupby('UserId').agg({'Result':np.mean})
        item_mean_rate = log_train.groupby('ItemId').agg({'Result':np.mean})

        #计算bias
        print 'calc bias start'
        start_time = time.time()
        for user in train_users:
            i += 1
            if i%2000==0:
                print '2000 used time',time.time()-start_time
                start_time = time.time()
            self.user_params.loc[user,'bias'] = user_mean_rate.loc[user,'Result']-self.u
        for item in train_items:
            self.item_params.loc[item,'bias'] = item_mean_rate.loc[item,'Result']-self.u

        print 'bias total used time',time.time()-start_time
大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

membalas semua(4)
阿神

Panda mempunyai penjana df.iterrows() untuk menggelung melalui baris DataFrame, yang merupakan yang paling cekap.

Untuk butiran, sila lihat dokumentasi:
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.iterrows.html

左手右手慢动作

Saya tidak pernah melakukan apa-apa magnitud ini, tetapi pengalaman saya adalah yang terbaik untuk tidak mengendalikan df satu demi satu Ia pada dasarnya perlahan, dan keseluruhan operasi lajur adalah lebih pantas
1 (tambah)
Sebaik-baiknya tulis semua nilai baharu dalam df kosong, dan kemudian gabungkan
, tetapi kadangkala tidak dapat dielakkan untuk ditambahkan secara langsung
2. Ia lebih pantas untuk dipadamkan dan gunakan pernyataan del secara langsung
3 .Menukar
juga menerima pakai idea ​​menggabungkan, menimpa nilai asal

小葫芦

Saya tidak fikir tugasan itu lambat
self.user_params.loc[user,'bias'] adalah bersamaan dengan mengambil indeks peringkat kedua daripada indeks peringkat pertama, yang sepatutnya sangat perlahan
Bolehkah anda meletakkan item dan pengguna Bagaimana pula dengan membahagikannya kepada dua bingkai data?

Ty80

loc adalah yang paling perlahan. Cuba gunakan ix sebaliknya. Lebih baik menggunakan iterrow untuk membina gelung.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan