2016-12-01 4 views
3

Pandasdataframeの各行にlistを生成する複雑な関数があります。私はlistという新しい列の各行の値をmylistとしたいと思います。新しいPandas Dataframe列にapplyを介して新しいリストを追加します

これを実行するPandasの能力は、開始データフレームの列数に依存するようです。

import pandas as pd 

df = pd.DataFrame(data=[['A', 'D'], 
         ['B', 'E'], 
         ['C', 'F']], 
        columns=['col1', 'col2']) 

df1 = pd.DataFrame(data=[['A', 'D', 'G'], 
         ['B', 'E', 'H'], 
         ['C', 'F', 'I']], 
        columns=['col1', 'col2', 'col3']) 

def add_list(row): 
    return [1,3, 3] 

df['mylist'] = df.apply(add_list, axis=1) 
print df 

利回り:

col1 col2  list 
0 A D [1, 3, 3] 
1 B E [1, 3, 3] 
2 C F [1, 3, 3] 

この追加のコード利回りValueError: Wrong number of items passed 3, placement implies 1。なぜ始まりの列の数はdataframeに影響を与える必要がありますか?

df1['mylist'] = df1.apply(add_list, axis=1) 
print df1 

Iは、(一つの要素を追加すること)以下に機能を変更する場合、エラーがない:

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

期待出力:

col1 col2 col3  list 
0 A D G [1, 3, 3] 
1 B E H [1, 3, 3] 
2 C F I [1, 3, 3] 
+0

実際の出力は何ですか? –

+0

@JoeRは期待される出力を追加しました – user2242044

答えて

1

これは奇妙な行動です。解決策は、リストの代わりにタプルを返すことです。

def add_list(row): 
    return (1, 3, 3) 

df1['mylist'] = df1.apply(add_list, axis=1).apply(list) 

最後の行では、タプルがデータフレーム内でリストに変換されていることがわかります。

+0

本当に奇妙ですね...これはコードのバグですか? – user2242044

+0

私はバギーに見えます!しかし、このソリューションではそれほど大したことではないようです。 – AlexG

+0

ええ、それはうまくいきます。必要に応じて、 'lambda'関数を使ってアイテムをリストに戻すことができます。 – user2242044

関連する問題