2017-02-28 10 views
2

私は文字列の最初の6文字を取る非常に基本的な機能を持っています。私はそれをDataFrameの列に適用したいと思います。Pandasの基本的な問題を解決するには

コード:

import re 
import pandas as pd 
import numpy as np 
dfp = pd.DataFrame({'A' : [np.NaN,np.NaN,3,4,5,5,3,1,5,np.NaN], 
        'B' : [1,0,3,5,0,0,np.NaN,9,0,0], 
        'C' : ['AA1233445','A9875', 'rmacy','Idaho Rx','Ab123455','TV192837','RX','Ohio Drugs','RX12345','USA Pharma'], 
        'D' : [123456,123456,1234567,12345678,12345,12345,12345678,123456789,1234567,np.NaN], 
        'E' : ['Assign','Unassign','Assign','Ugly','Appreciate','Undo','Assign','Unicycle','Assign','Unicorn',]}) 
def six_dig(thing): 
    return str(thing)[:6] 

dfp6= dfp[dfp['C'].apply(six_dig, axis=1)] 

しかし、私は得る:TypeError: six_dig() got an unexpected keyword argument 'axis' 私も.map()を使用してみましたが、同じエラーを取得します。私はaxis=1を削除した場合

私が取得:KeyError: ["STUFF"] not in index

私は私の前にデータフレームの列で関数を使用してきたように、超簡単な何かが欠けする必要があります

...

答えて

5

私はあなただけのことができると思います:

dfp6 = dfp['C'].str[:6] 

これが返されます。

In [14]: dfp6 
Out[14]: 
0 AA1233 
1  A9875 
2  rmacy 
3 Idaho 
4 Ab1234 
5 TV1928 
6  RX 
7 Ohio D 
8 RX1234 
9 USA Ph 
Name: C, dtype: object 
+0

あなたは絶対的に正しいです。小さなステップを省いてくれてありがとう。 @ pansenの答えは、私に何が間違っているかを教えてくれた。 – MattR

+0

@MattR嬉しいです! –

2

あなたの使い方Rたとえば、次のようにうまく動作します:

print(dfp['C'].map(six_dig)) 
0 AA1233 
1  A9875 
2  rmacy 
3 Idaho 
4 Ab1234 
5 TV1928 
6  RX 
7 Ohio D 
8 RX1234 
9 USA Ph 
Name: C, dtype: object 
+0

私はそれがとても簡単なことを知っていました....私は私の例の周りに余分な 'dfp []'を追加していました。 – MattR

1

あなたはベクトル化機能を使用したい場合は - ここの例である:

In [35]: def my_slice(ser, start=0, end=10, step=1): 
    ...:  return ser.str.slice(start, end, step) 
    ...: 

In [36]: my_slice(dfp.C, end=6) 
Out[36]: 
0 AA1233 
1  A9875 
2  rmacy 
3 Idaho 
4 Ab1234 
5 TV1928 
6  RX 
7 Ohio D 
8 RX1234 
9 USA Ph 
Name: C, dtype: object