2017-02-27 35 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