私は単純なデータフレームdf
とリストlists
の列を持っています。 lists
に基づいて3つの列を追加したいと思います。私はdf
は次のようになりたいと思いPandas Dataframe、リストの列、累積リストの列の作成、レコードの差によるレコード
import pandas as pd
lists={1:[[1]],2:[[1,2,3]],3:[[2,9,7,9]],4:[[2,7,3,5]]}
#create test dataframe
df=pd.DataFrame.from_dict(lists,orient='index')
df=df.rename(columns={0:'lists'})
df
lists
1 [1]
2 [1, 2, 3]
3 [2, 9, 7, 9]
4 [2, 7, 3, 5]
:
df
は次のようになります
lists cumset adds drops
1 [1] {1} {1} {}
2 [1,2,3] {1,2,3} {2,3} {}
3 [2,9,7,9] {1,2,3,7,9} {7,9} {3}
4 [2,7,3,5] {1,2,3,5,7,9} {3,5} {9}
基本的に私は、適用のcumset
(いくつかのタイプを作成する方法を理解する必要があります?(されます既にpandas関数がありますか?)次に、追加と削除のために、基本的にはdf.lists.shift()とdf.lists.shift()を比較して、新しいアイテムと見つからないアイテムを判別します。
df['adds']=df[['lists',df.lists.shift()]].apply(lambda x: {i for i in x.lists if i not in x.lists.shift()}, axis=1)
楽しくありがとうございます。
あなたは累計列を作り、セットの代わりに、リストで列を作り、「追加」と列を「ドロップ」にするために pandas.DataFrame.shiftを使用する pandas.DataFrame.cumsumを使用することができます
優れており、それが動作します。私は最善の解決策は、以下の両方のlukessと@ jezrealの組み合わせだと思う。 ['add']と['drop']のIMO lukessハンドリングは、新しいtempカラムを作成する実際のdfカラムのインスタンスを使用するのと同じように、少しピジョンソニックです。 jezrealは、np.uniqueを必要とせずに.cumsumを処理するのに少しピジョンがあり、lambdaを使用する代わりにapply(set)します。 「else set」を使用してシフトから作成されたナノを固定する際には、特に0インデックスに適用される場合よりもわずかに優れています。素晴らしい職人。彼が最初だったのでlukessを選んだが、どちらもupvoted! – clg4