С данными, как это одинВекторизованных «и» для панд колонн
import pandas as pd
tcd = pd.DataFrame({
'a': {'p_1': 1, 'p_2': 1, 'p_3': 0, 'p_4': 0},
'b': {'p_1': 0, 'p_2': 1, 'p_3': 1, 'p_4': 1},
'c': {'p_1': 0, 'p_2': 0, 'p_3': 1, 'p_4': 0}})
tcd
# a b c
# p_1 1 0 0
# p_2 1 1 0
# p_3 0 1 1
# p_4 0 1 0
(но с 40e3 колоннами)
Я ищу векторизованный способ поставить логический и в серии результатов :
a & b = ab -> 1 or True a & c = ac -> 0 or False
1 0 0 1 0 0
1 1 0 1 0 0
0 1 1 0 1 0
0 1 0 0 0 0
Сейчас я получаю только уродливое решение с петлей для ::
res = pd.Series(index=['a&a', 'a&b', 'a&c'])
for i in range(3):
res[i] = (tcd.iloc[:, 0] & tcd.iloc[:, i]).any()
res
aa 1
ab 1
ac 0
с B.M. ответ я получаю это
def get_shared_p(tcd, i):
res = (tcd.iloc[:, i][:, None] & tcd).any()
res.index += '&_{}'.format(i)
return res
res = pd.DataFrame(columns=range(cols), index=range(cols))
for col_i in range(cols):
res.iloc[:, col_i] = list(get_shared_p(tcd, col_i))
print res
# 0 1 2
# 0 True True False
# 1 True True True
# 2 False True True
Мы можем, вероятно, избежать этого нового для цикла.
действительно замечательный @ b-m! BTW мы можем использовать тот же метод, чтобы получить кросс-матрицу с & a, & b, & c или с & _0, & _1, & 2 – user3313834
IIUC, 'res = (tcd.T.p_1 [:, None] & tcd.T) .any (); res.index + = '&p_1'; res'? –
B.M. Я обновил вопрос, чтобы объяснить это. – user3313834