2017-06-12 4 views
1

私は単純なデータフレーム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を使用することができます

答えて

1

import pandas as pd 
import numpy as np 


df['cumset'] = df['lists'].cumsum().apply(lambda x: np.unique(x)) 
df['sets'] = df['lists'].apply(lambda x: set(x)) 

shifted = df['sets'].shift(1).apply(lambda x: x if not pd.isnull(x) else set()) 

df['add'] = df['sets'] - shifted 
df['drop'] = shifted - df['sets'] 
df = df.drop('sets', axis=1) 

print(df) 
#-->Output: 
      lists    cumset  add drop 
1   [1]     [1]  {1}  {} 
2  [1, 2, 3]   [1, 2, 3] {2, 3}  {} 
3 [2, 9, 7, 9]  [1, 2, 3, 7, 9] {9, 7} {1, 3} 
4 [2, 7, 3, 5] [1, 2, 3, 5, 7, 9] {3, 5}  {9} 
+1

優れており、それが動作します。私は最善の解決策は、以下の両方のlukessと@ jezrealの組み合わせだと思う。 ['add']と['drop']のIMO lukessハンドリングは、新しいtempカラムを作成する実際のdfカラムのインスタンスを使用するのと同じように、少しピジョンソニックです。 jezrealは、np.uniqueを必要とせずに.cumsumを処理するのに少しピジョンがあり、lambdaを使用する代わりにapply(set)します。 「else set」を使用してシフトから作成されたナノを固定する際には、特に0インデックスに適用される場合よりもわずかに優れています。素晴らしい職人。彼が最初だったのでlukessを選んだが、どちらもupvoted! – clg4

1

私はあなたがSeries.cumsum +を使用することができると思いますSeries.shift + Series.iatsetのために主にSeries.apply

df['cumset'] = df['lists'].cumsum().apply(set) 
lists_sets = df['lists'].apply(set) 
lists_shifted = lists_sets.shift() 
#replace first value - NaN to set 
lists_shifted.iat[0] = set() 
lists_shifted = lists_shifted.apply(set) 
df['add'] = lists_sets - lists_shifted 
df['drop'] = lists_shifted - lists_sets 
print (df) 
      lists    cumset  add drop 
1   [1]     {1}  {1}  {} 
2  [1, 2, 3]   {1, 2, 3} {2, 3}  {} 
3 [2, 9, 7, 9]  {1, 2, 3, 9, 7} {9, 7} {1, 3} 
4 [2, 7, 3, 5] {1, 2, 3, 5, 7, 9} {3, 5}  {9} 
+0

thx jezreal。選択したソリューションのlukessのコメントを参照してください。あなたのものは完璧に動作し、私はupvoted。 – clg4

+0

ありがとうございます。がんばろう! – jezrael

関連する問題