我有许多列格式为' 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的新手,所以仍然在研究一些更基本的原理
答案 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