你想知道groupby
是否可以在这里使用,所以我会提到它是如何的。短版,虽然我可能会写这两条线为清楚:
(df == 'present').groupby(lambda x: x.rsplit("_", 1)[0], axis=1).sum() == 1
首先,我们可以从一个例子开始数据帧,@unutbu致意(注:这是你们的不同,所以输出是不是所有的真):
>>> import pandas as pd
>>> df = pd.DataFrame(['present absent absent absent'.split(),
'present present present absent'.split()],
columns='elem_1_pre elem_1_post elem_2_pre elem_2_post'.split(),
index='Observation1 Observation2'.split(),)
>>> df
elem_1_pre elem_1_post elem_2_pre elem_2_post
Observation1 present absent absent absent
Observation2 present present present absent
我们可以判断哪些是present
:
>>> p = df == "present"
>>> p
elem_1_pre elem_1_post elem_2_pre elem_2_post
Observation1 True False False False
Observation2 True True True False
然后,我们真正想要做的是将列分组到“elem_1”位。您可以使用字符串方法或正则表达式,或者如果它们是有序的,则可以使用索我喜欢使用字符串方法,因此我们将右侧的第一个_
分隔列名称。要通过列组,我们使用axis=1
:
>>> for k, g in p.groupby(lambda x: x.rsplit("_", 1)[0], axis=1):
print 'group key:', k
print g
...
group key: elem_1
elem_1_pre elem_1_post
Observation1 True False
Observation2 True True
group key: elem_2
elem_2_pre elem_2_post
Observation1 False False
Observation2 True False
我们想算成一排的真值,看看是否有只有一个。真〜1和False〜0,所以我们可以使用sum
:
>>> p.groupby(lambda x: x.rsplit("_", 1)[0], axis=1).sum()
elem_1 elem_2
Observation1 1 0
Observation2 2 1
然后
>>> p.groupby(lambda x: x.rsplit("_", 1)[0], axis=1).sum() == 1
elem_1 elem_2
Observation1 True False
Observation2 False True
或者,把他们放在一起:
>>> grouped = (df == "present").groupby(lambda x: x.rsplit("_", 1)[0], axis=1)
>>> answer = grouped.sum() == 1
>>> answer
elem_1 elem_2
Observation1 True False
Observation2 False True
他们这些人恰恰是因为我建源DataaFrame,所以我会放弃这一点。谢谢 – Einar 2013-05-06 09:58:02