2016-07-25 3 views
1

私は以下のようなループを使用して、やや手動アプローチをやってみました:とパンダのデータフレーム内の列のすべての値に関数を適用するにはどうすればよいですか?

data = pd.read_csv('data/training.csv') 
for idx,imageString in enumerate(data.iloc[:,-1]): 
    # print(imageString[0:10]) 
    data[idx,-1] = imageString.split(" ") 

しかし、最後の行に、このエラーが出:

ValueError: Length of values does not match length of index

だから私の質問は以下のとおりです。

  1. 誰でも上記のエラーが発生する理由を説明することができます。どうすればいいですか? これを回避するには?
  2. これは、データフレームの最後の列の の値にsplitを適用する適切な方法ですか?

#2について - applymapを使用している人がいましたが、これは新しい列を作成すると思います。既存の列の値を別のリストに置き換えたいだけです。

+0

データ[data.columns [-1] = data.ilocの[:、 - 1]の.map(ラムダX:x.split ( '')) – frist

答えて

2

私はあなたがstr.splitが必要だと思う。そして、

data = pd.read_csv('data/training.csv') 
data.iloc[:,-1] = data.iloc[:,-1].str.split(expand=False) 

str[1]またはstr[n]でリストの最初のまたはいくつかの他の要素を選択します。

data.iloc[:,-1] = data.iloc[:,-1].str.split(expand=False).str[0] 
data.iloc[:,-1] = data.iloc[:,-1].str.split(expand=False).str[n] 

サンプル:

import pandas as pd 

data = pd.DataFrame({'A':[1,2,3], 
        'B':[4,5,6], 
        'C':[7,8,9], 
        'D':[1,3,5], 
        'E':[5,3,6], 
        'F':['aa aa','ss uu','ee tt']}) 

print (data) 
    A B C D E  F 
0 1 4 7 1 5 aa aa 
1 2 5 8 3 3 ss uu 
2 3 6 9 5 6 ee tt 

print (data.iloc[:,-1].str.split(expand=False)) 
0 [aa, aa] 
1 [ss, uu] 
2 [ee, tt] 
Name: F, dtype: object 

data.iloc[:,-1] = data.iloc[:,-1].str.split(expand=False).str[0] 
print (data) 
    A B C D E F 
0 1 4 7 1 5 aa 
1 2 5 8 3 3 ss 
2 3 6 9 5 6 ee 

data.iloc[:,-1] = data.iloc[:,-1].str.split(expand=False).str[1] 
print (data) 
    A B C D E F 
0 1 4 7 1 5 aa 
1 2 5 8 3 3 uu 
2 3 6 9 5 6 tt 

Can anyone explain why I am getting the above error and how can I get around it?

問題imageString.split(" ")リターンlistdata[idx,-1]に割り当てた場合、文字列の構成要素の長さは、全てのデータフレームの長さ以下です。

Is this the proper way to apply a split to every value in the last column of my data frame?

pandas documentationを参照してください。

0

値に正しくアクセスしていません。

あなたのコードを修正するには、最後の行は次のようになります。

df.iat[idx, -1] = imageString.split(" ") 

iatはスカラーが取得および設定するために使用されています。

これはおそらく、あなたの目的を達成するための簡単な方法です:

df.iloc[:, -1] = df.iloc[:, -1].str.split() 
関連する問題