基于另一个表创建多个表?

时间:2016-07-03 02:51:01

标签: python python-3.x pandas filter

我有许多列格式为' NameX(TypeY)'。格式如下:

total =  pd.DataFrame(table):

         NameA(Type1)    NameA(Type2)    NameA(Type3)   NameB(Type1)   NameB(Type2)    NameB.(Type3)
set1           1               1              1             2              3               4
set2           2               3              1             1              0               2
set3           2               2              1             0              0               3

所以我现在的目标是以这种格式为每个名称(A,B,X ...)获取一个表格,我不想更改设置行,因此名称A的示例输出将是:

     Type1       Type2       Type3
set1    1           1           1
set2    2           3           1 
set3    2           2           1

我正在考虑以某种方式使用for循环,但无法弄清楚如何获得这样的多个表。

任何帮助都会非常感激!我是编程和python的新手,所以仍然在研究一些更基本的原理

2 个答案:

答案 0 :(得分:1)

from collections import defaultdict

dfs = defaultdict(pd.DataFrame)

for name_sample, series in df.iteritems():
    name, sample = name_sample.split('.')
    dfs[name][sample] = series

上面给出了一个dict,每个唯一的“Name”有一个表:

        {'NameA':      Sample#1  Sample#2  Sample#3
         id                               
         id1         1         1         1
         id2         2         3         1
         id3         2         2         1,
         'NameB':      Sample#1  Sample#2  Sample#3
         id                               
         id1         2         3         4
         id2         1         0         2
         id3         0         0         3}

这依赖于以下事实:您可以在构建后向DataFrame添加列,并使用defaultdict来获取外部容器的类似行为。

无论行数多少,性能应该都很好,但是如果你有大量的列可能有更好的方法(因为上面依赖于列上的Python循环)

答案 1 :(得分:1)

试试这个:

一个人:

df2 = df.filter(like='NameA', axis=1).rename(columns=lambda x: x.replace('NameA', '').replace('(', '').replace(')', ''))

列表:

Dflist = ['NameA','NameB' ] 
DfDict = {}

for e in Dflist: 
    out = df.filter(like=e, axis=1).rename(columns=lambda x: x.replace(e, '').replace('(', '').replace(')', ''))
#     print out , "\n"
    DfDict[e] = out

DfDict["NameA"]

#      Type1  Type2  Type3
# set1      1      1      1
# set2      2      3      1
# set3      2      2      1