鉴于此数据框:
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
更新 我的实际数据框将有一些我不需要的列,列不会有任何顺序,所以我需要能够按名称获取列。
提前致谢!
答案 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