2017-02-27 39 views
2

我有一个数据帧如下:熊猫StartsWith多个选项

<A> "B" C _:D <E> 
    A  B "C" <D> E> 
<A> "B" "C"  D <E> 

我试图找到一种方法,将检查哪些元素与“<”或““”或开始‘_:’并返回据帧如下:

1  1  0  1  1 
    0  0  1  1  0 
    1  1  1  0  1 

不使用申请,由于数据框的大小 理想的情况下我的最终数据框变为如下:

<A> "B" C _:D <E> 4 
    A  B "C" <D> E> 2 
<A> "B" "C"  D <E> 4 

谢谢

回答

7

UPDATE:

如何添加到原始数据帧包含1S 在栈+拆散发现之列?

In [59]: df['new'] = df.stack().str.contains(r'^(?:\"|<|_:)').astype(np.uint8).sum(level=0) 

In [60]: df 
Out[60]: 
    0 1 2 3 4 new 
0 <A> "B" C _:D <E> 4 
1 A B "C" <D> E> 2 
2 A< B" C" D E< 0 # pay attention at this row 

老答案:

试试这个:

df.apply(lambda col: col.str.contains(r'^\"|<|_:').astype(np.uint8)) 

演示:

In [33]: df.apply(lambda col: col.str.contains(r'^\"|<|_:').astype(np.uint8)) 
Out[33]: 
    0 1 2 3 4 
0 1 1 0 1 1 
1 0 0 1 1 0 
2 1 1 1 0 1 

或者使用stack() + unstack()

In [36]: df.stack().str.contains(r'^\"|<|_:').astype(np.uint8).unstack() 
Out[36]: 
    0 1 2 3 4 
0 1 1 0 1 1 
1 0 0 1 1 0 
2 1 1 1 0 1 
+0

THX @MaxU我更新了我的问题提一提,我试图做到这一点不适用。 – Kelaref

+2

@Kelaref,我已经更新了我的答案......你真正的DF有多少列? – MaxU

+0

@Kelaref我不认为你会比MaxU的stack() - > unstack()方法快得多。 – miradulo