根据原始数据框列号创建多个数据框

时间:2018-08-27 02:23:49

标签: python pandas dataframe

我已经搜索了很长时间,但是没有找到任何类似的问题。如果有,请告诉我!

我目前正在尝试将一个数据帧分为n个数据帧,其中n等于原始数据帧的列数。所有新的结果数据框必须始终保留原始数据框的第一列。例如,可以将所有togheter都收集在一个列表中,以供进一步访问。

为了使我的意图形象化,这里举一个简短的例子:

 >> original df

 GeneID   A      B      C      D      E
   1     0.3    0.2    0.6    0.4    0.8
   2     0.5    0.3    0.1    0.2    0.6
   3     0.4    0.1    0.5    0.1    0.3
   4     0.9    0.7    0.1    0.6    0.7
   5     0.1    0.4    0.7    0.2    0.5

我想要的输出将是这样的:

 >> df1

 GeneID   A
   1     0.3 
   2     0.5
   3     0.4
   4     0.9
   5     0.1

 >> df2

 GeneID   B
    1    0.2
    2    0.3
    3    0.1
    4    0.7
    5    0.4


 ....

依此类推,直到覆盖了原始数据框中的所有列。 什么是更好的解决方案?

3 个答案:

答案 0 :(得分:1)

您可以使用df.columns获取所有列名,然后创建子数据框:

outdflist =[]
# for each column beyond first: 
for col in oridf.columns[1:]:
    # create a subdf with desired columns:
    subdf = oridf[['GeneID',col]]
    # append subdf to list of df: 
    outdflist.append(subdf)

# to view all dataframes created: 
for df in outdflist:
    print(df)

输出:

   GeneID    A
0       1  0.3
1       2  0.5
2       3  0.4
3       4  0.9
4       5  0.1
   GeneID    B
0       1  0.2
1       2  0.3
2       3  0.1
3       4  0.7
4       5  0.4
   GeneID    C
0       1  0.6
1       2  0.1
2       3  0.5
3       4  0.1
4       5  0.7
   GeneID    D
0       1  0.4
1       2  0.2
2       3  0.1
3       4  0.6
4       5  0.2
   GeneID    E
0       1  0.8
1       2  0.6
2       3  0.3
3       4  0.7
4       5  0.5

for循环也可以更简单地编写为列表理解:

outdflist = [ oridf[['GeneID', col]] 
              for col in oridf.columns[1:] ]

答案 1 :(得分:1)

您可以使用groupby

d={'df'+ str(x): y for x , y in df.groupby(level=0,axis=1)}
d
Out[989]: 
{'dfA':      A
 0  0.3
 1  0.5
 2  0.4
 3  0.9
 4  0.1, 'dfB':      B
 0  0.2
 1  0.3
 2  0.1
 3  0.7
 4  0.4, 'dfC':      C
 0  0.6
 1  0.1
 2  0.5
 3  0.1
 4  0.7, 'dfD':      D
 0  0.4
 1  0.2
 2  0.1
 3  0.6
 4  0.2, 'dfE':      E
 0  0.8
 1  0.6
 2  0.3
 3  0.7
 4  0.5, 'dfGeneID':    GeneID
 0       1
 1       2
 2       3
 3       4
 4       5}

答案 2 :(得分:0)

您可以创建一个列名列表,并手动遍历并在每个循环中创建一个新的DataFrame。

>>> import pandas as pd
>>> d = {'col1':[1,2,3], 'col2':[3,4,5], 'col3':[6,7,8]}
>>> df = pd.DataFrame(data=d)
>>> df
   col1  col2  col3
0     1     3     6
1     2     4     7
2     3     5     8
>>> newstuff=[]
>>> columns = list(df)
>>> for column in columns:
...     newstuff.append(pd.DataFrame(data=df[column]))

除非您的数据帧不合理地庞大,否则上述代码应能发挥作用。