2017-11-09 35 views
1

としてスライスし、データフレームのシリーズを使用して:サブ私のようなデータフレームを持って終了

BLOCKQUOTE

df 
Out[458]: 

    strings 
0 lui sau chun 
1 d1420152 
2 98764879333 
3 minglee  
4 g1927384 
5 hannah 

私がやりたい、何が2 /第三ののを抽出することですstrings列の各値の文字列。ご覧のように、各ストリングの長さが違うので、2/3の位置をスライスオフすることも異なります。私の目標出力は次のようになります。

BLOCKQUOTE

df 
Out[459]: 
    strings   substring 
0 lui sau chun  liu sau 
1 d1420152   d1420 
2 98764879333  98764879 
3 minglee   ming 
4 g1927384   g1927 
5 annah   hann 

を私が試した:

x=(df['strings'].str.len()*2/3).apply(np.floor).astype(int) 
df['strings'].str.slice(0,x) 

をしかし、これはちょうど私に次のような出力が得られた:

BLOCKQUOTEを

Out[451]: 
0 NaN 
1 NaN 
2 NaN 
3 NaN 
4 NaN 
Name: strings, dtype: float64 

誰でも助けてもらえますか?まずで新しい列を作成し、apply

print (df['strings'].apply(lambda x: x[:int(len(x)*2/3)])) 
0 lui sau 
1  d1420 
2  9876487 
3  ming 
4  g1927 
5  hann 
Name: strings, dtype: object 

別の解決策:

+0

私の答えが役に立ったら、[accept](http://meta.stackexchange.com/a/5235/295067)それを忘れないでください - 答えの横にあるチェックマーク( '✓')をクリックしてくださいそれを灰色で塗りつぶして、塗りつぶしてください。ありがとう。 – jezrael

答えて

1

がベターカウントlen秒でSeries.applyを使用して[]によってインデックスによって選択ですありがとう行単位のプロセスのためのaxis=1

df['l'] =(df['strings'].str.len()*2/3).apply(np.floor).astype(int) 
print (df) 
     strings l 
0 lui sau chun 8 
1  d1420152 5 
2 98764879333 7 
3  minglee 4 
4  g1927384 5 
5  hannah 4 

print (df.apply(lambda x: x['strings'][0: x['l']], axis=1)) 
0 lui sau 
1  d1420 
2  9876487 
3  ming 
4  g1927 
5  hann 
dtype: object 
関連する問題