2013-10-29 9 views
15

エラーが発生しています。パンダデータフレームValueError:渡された値の形状は(X、)、インデックスは(X、Y)を暗示します。

次が動作しているようです:

def random(row): 
    return [1,2,3,4] 

df = pandas.DataFrame(np.random.randn(5, 4), columns=list('ABCD')) 

df.apply(func = random, axis = 1) 

と私の出力は次のとおりです。

[1,2,3,4] 
[1,2,3,4] 
[1,2,3,4] 
[1,2,3,4] 

しかし、私は、このような1またはNoneとしての価値に列のの1つを変更する場合:

def random(row): 
    return [1,2,3,4] 

df = pandas.DataFrame(np.random.randn(5, 4), columns=list('ABCD')) 
df['E'] = 1 

df.apply(func = random, axis = 1) 

私はエラーを取得します

ValueError: Shape of passed values is (5,), indices imply (5, 5) 

私は数日間このことに取り組んできましたが、何も動作していないようです。興味深いのは、私が変更されたときに

def random(row): 
    return [1,2,3,4] 

def random(row): 
    print [1,2,3,4] 

にすべてが正常に動作するように思われることです。

この質問は、私が混乱していたかもしれないと感じているasking this questionのより明確な方法です。

私の目標は、各行のリストを計算し、その中から列を作成することです。

EDIT:私はもともと、1列分のデータフレームから始めました。 4つの差分適用ステップで4つの列を追加し、別の列を追加しようとするとこのエラーが発生します。

+1

だけで結構です下に、私はコードを使用しますか?リストを返す関数でapplyを使うと、これをSeriesに強制しようとするので、元の長さと同じ長さ、またはスカラー(Noneを含む)が必要です。 – Jeff

+0

あなたの質問の出力は、あなたが適用から得たものではありません。最初のケースでは、4つの列を持つDataFrameが出力されます。@ Jeffによれば、リストには行が含まれています。 –

+0

データフレームに列を追加しようとしています。この列は、計算された値で埋められます。計算された値は、各行の値から計算されます。関数randomは、値を計算するものです。 – user1367204

答えて

6

あなたの目標は、(表示しない)だけでスカラー値を返す関数として、あなたの関数を記述し、データフレームに新しい列を追加し、このようなものである場合:

>>> def random(row): 
...  return row.mean() 

してから適用されます使用します。

>>> df['new'] = df.apply(func = random, axis = 1) 
>>> df 
      A   B   C   D  new 
0 0.201143 -2.345828 -2.186106 -0.784721 -1.278878 
1 -0.198460 0.544879 0.554407 -0.161357 0.184867 
2 0.269807 1.132344 0.120303 -0.116843 0.351403 
3 -1.131396 1.278477 1.567599 0.483912 0.549648 
4 0.288147 0.382764 -0.840972 0.838950 0.167222 

新しい列にリストを含めることが可能かどうかは分かりませんが、タプル([...]の代わりに(...)ではなく)を入れることは不可能です:

>>> def random(row): 
... return (1,2,3,4,5) 
... 
>>> df['new'] = df.apply(func = random, axis = 1) 
>>> df 
      A   B   C   D    new 
0 0.201143 -2.345828 -2.186106 -0.784721 (1, 2, 3, 4, 5) 
1 -0.198460 0.544879 0.554407 -0.161357 (1, 2, 3, 4, 5) 
2 0.269807 1.132344 0.120303 -0.116843 (1, 2, 3, 4, 5) 
3 -1.131396 1.278477 1.567599 0.483912 (1, 2, 3, 4, 5) 
4 0.288147 0.382764 -0.840972 0.838950 (1, 2, 3, 4, 5) 
+0

しかし、関数からの戻り値は項目のリストになります。言い換えれば、「新しい」列はリストの束である。私はリストを返すことにそれを働かせることはできません。 – user1367204

+0

@ user1367204あなたが望むならば、あなたはタプルを使うことができます –

+0

例を挙げてください。あなたはリストの代わりにタプルを返さなければならないのですか?私はリターン(1,2,3,4)のためにリターン[1,2,3,4]を切り替えようとしましたが、同じエラーが発生しました。 – user1367204

0

あなたが実際にやろうとしているもの

import numpy as np  
df = pd.DataFrame(np.array(your_data), columns=columns) 
+0

もう少し文脈を提供するために答えを編集してください。元の問題をどうやって解決しますか?ここで回答を書くための偉大な入門については、ヘルプセクションをご覧ください:https://stackoverflow.com/help/answering – Graham

関連する問題