2017-12-14 6 views
1

私は自分自身を説明することができない状況に直面しています。まず、applyとtransform関数についてです。今まで私が理解していたのはデータフレーム全体に適用されますが、変換は各行で動作するため適用よりも遅くなりました。だからここに私のデータフレームは、私がdf.groupby('id')['size'].apply(lambda col: ', '.join(col))を適用するときには、 0 NaN 1 NaN 2 NaN 3 NaN 4 NaN 5 NaN 6 NaN 返品によるパンダのグループNANのapply vs transformの機能

を返します。しかし、私はdf.groupby('id')['size'].transform(lambda col: ', '.join(col))、変換ならば、私はそれがあるため適用で作業したい 0 40/6, 41/7, 42/8, 43/9, 44/10, 45/11, 46/12 1 40/6, 41/7, 42/8, 43/9, 44/10, 45/11, 46/12 2 40/6, 41/7, 42/8, 43/9, 44/10, 45/11, 46/12 3 40/6, 41/7, 42/8, 43/9, 44/10, 45/11, 46/12 4 40/6, 41/7, 42/8, 43/9, 44/10, 45/11, 46/12 5 40/6, 41/7, 42/8, 43/9, 44/10, 45/11, 46/12 6 40/6, 41/7, 42/8, 43/9, 44/10, 45/11, 46/12

を取得し、今 size id 40/6 2479 41/7 2479 42/8 2479 43/9 2479 44/10 2479 45/11 2479 46/12 2479

です私は3百万行を持ち、速度は重要な要素です。適用するか、変換のいずれか使用して

第二の問題

私のサイズのデータ​​が空のセルを持っている、すなわち size id 2479 41/7 2479 2479 43/9 2479 44/10 2479 45/11 2479 46/12 2479 、私はこのエラーを取得し、 TypeError: sequence item 0: expected string, float found 私はヌル値にその原因を理解しています。私の質問は、どうすればこれを克服できますか?私は利用可能な値の和集合を必要とし、nullを無視します。

ありがとうございました。私はあなたがapplydropnaが必要だと思う

+0

おそらく、あなたが集約すなわち 'df.groupby( 'ID')を探しています['size'] .gg(lambda col: '、' .join(col)) ' – Dark

答えて

3

lambdaは省略されなければならない:

df=df.dropna(subset=['size']).groupby('id')['size'].apply(', '.join).reset_index(name='col') 

または非常に類似した:

df = df['size'].dropna().groupby(df['id']).apply(', '.join).reset_index(name='col') 
+0

素晴らしい@jezrael。もう一つの問題。 2つの項目を返すので、 'df ['jointed_size']'に代入することはできません。また、パンダを使ったcsv操作の多くを学ぶ最も良い方法は何ですか?私はあなたの答えを受け入れるでしょう。 – mmrs151

+0

次に、 'df ['jointed_size'] = df ['size']を使用してください。dropna()。groupby(df ['id'])。transform( '、' .join)' - サイズの値。 – jezrael

関連する問題