在循环

时间:2017-08-04 16:09:44

标签: python loops pandas dataframe

鉴于此数据框:

import pandas as pd
df=pd.DataFrame({'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]})
df
    A   B   C
0   1   4   7
1   2   5   8
2   3   6   9

我想创建3个新数据框;每列一个。 我可以这样做一次:

a=pd.DataFrame(df[['A']])
a
    A
0   1
1   2
2   3

但我不想为每一栏做这件事,而是想在一个循环中这样做。

以下是我尝试的内容:

a=b=c=df.copy()
dfs=[a,b,c]
fields=['A','B','C']
for d,f in zip(dfs,fields):
    d=pd.DataFrame(d[[f]])

...但是当我打印每一个时,我得到的是整个原始数据框而不仅仅是感兴趣的列。

a
        A   B   C
    0   1   4   7
    1   2   5   8
    2   3   6   9

更新 我的实际数据框将有一些我不需要的列,列不会有任何顺序,所以我需要能够按名称获取列。

提前致谢!

3 个答案:

答案 0 :(得分:3)

简单的列表理解应该足够了。

In [68]: df_list = [df[[x]] for x in df.columns]

打印出列表,这就是你得到的:

In [69]: for d in df_list:
    ...:     print(d)
    ...:     print('-' * 5)
    ...:     
   A
0  1
1  2
2  3
-----
   B
0  4
1  5
2  6
-----
   C
0  7
1  8
2  9
-----

df_list中的每个元素都是自己的数据框,对应于原始数据框中的每个数据框。此外,您甚至不需要fields,而是使用df.columns

答案 1 :(得分:1)

您应该使用$test

<?php
class TestClass {
    public $test;

    function __construct(){

        // this fails:
        //$this->test = (object) array();

        // so does this:
        /*
        $this->test = new stdClass();
        $this->test->hello = function(){
            return 'hello world!';
        };
        */

        $this->test = array();
        $this->test['foo'] = 'bar';
        $this->test['buttons'] = array();
        $this->test['hello'] = function(){
            return 'hello world!';
        };
        $this->test['addButton'] = function($title,$url){
            // how do I call the class' addButton function and
            // pass a reference of the $test varaible so it gets updated?
        };

    }

    // this function would be used for multiple objects
    function addButton(&$obj,$title,$url){
        $obj['buttons'][] = array(
            'title' => $title,
            'url' => $url
        );
    }
}

$myTestClass = new TestClass;
// this results in:
// Fatal error: Call to a member function hello() on null
echo $myTestClass->test['hello']();

然后像

一样循环
loc

答案 2 :(得分:1)

或者您可以尝试此操作,而不是创建df的副本,此方法会将结果返回为单Dataframe,而不是list,但是,我认为保存Dataframe进入列表更好

dfs=['a','b','c']
fields=['A','B','C']
variables = locals()
for d,f in zip(dfs,fields):
    variables["{0}".format(d)] = df[[f]]

a
Out[743]: 
   A
0  1
1  2
2  3
b
Out[744]: 
   B
0  4
1  5
2  6
c
Out[745]: 
   C
0  7
1  8
2  9