将来自多个数据框的行包含到新的数据框中

时间:2019-04-19 07:35:03

标签: python pandas dataframe

我大约有20个数据框,我在其中定位特定行的值。例如,我正在显示一个数据框的简化版本

    Type   N1   N2
    43     121  455
    23     554  52
    85     74   615

我想从我的数据集中获取每个“ Type” 23的行

我已经尝试了下面给出的代码,但是输出有些垃圾。

dataf = pd.DataFrame()
for x in [df1,df2,...df20]:
    data = x.loc[x['Type']==23]
dataf.append(data)

我希望有一个新的数据框,它具有与N1和N2相同的列,并具有选定行的值。

预期的新数据框:

    N1   N2
    554  52
    153  87  and so on..

2 个答案:

答案 0 :(得分:2)

我认为:

df_list = [df1,df2, ...,df20]
filtered_df_list = [ df[df['Type'] == 23] for df in df_list ] #Filter each mini-df on "Type" = 23

final_df = pd.concat(filtered_df_list) # Concat the small mini-dfs (hence faster concatenating)

根据数据帧的大小,可能会更高效,更省时,但这可以证明。如果您与我们分享一些数据以便我可以做,或者您想自己做,那么我对答案很感兴趣。

答案 1 :(得分:1)

在过滤之前使用pd.concat合并数据帧:

    ondragover(ev) {
        const holder = document.getElementById('holder1');
        holder.className = 'hover'
        return false;
    }
    ondragend(ev) {
        const holder = document.getElementById('holder1');
        holder.className = ''
        return false;
    }
    ondrop(e) {
        const holder = document.getElementById('holder1');
        holder.className = ''
        e.preventDefault();
        this.readfiles(e.dataTransfer.files);
        this.imageUpload();
    }
    readfiles(files) {
        this.files = files;
    }
    handleFileSelect(evt) {
        this.files = evt.target.files;
        this.imageUpload();
    }

    imageUpload() {

        setTimeout(() => {
            this.progress.percentage = 0;
            this.sonuc = this.files;
            for (let i = 0; i < this.sonuc.length; i++) {
                this.deneme.push({file: this.sonuc[i] , percantage: 0 , output: null });
                this.currentFileUpload = this.sonuc[i];

                const reader = new FileReader();
                reader.onload = (event: any) => {
                    this.deneme[this.deneme.length - this.sonuc.length + i].output = event.target.result;
                };
                reader.readAsDataURL(this.sonuc[i]);

                this.userService.imageCreate(this.currentFileUpload).subscribe(event => {
                    if (event.type === HttpEventType.UploadProgress  ) {
                        this.deneme[this.deneme.length - this.sonuc.length + i].percantage = Math.round(event.loaded / event.total * 100 );
                    } else if (event instanceof HttpResponse )  {
                        setTimeout(() => {
                            this.deneme[this.deneme.length - this.sonuc.length + i].progressDurumu = false;
                            console.log('Upload images!');
                        }, 500); }
                });
            }
        }, 51);
    }

稍微依赖于您的管道是什么样子,很有可能您在第一次读取数据帧时就已经可以合并它们。