2017-01-18 7 views
2

私は2つのカラム:itemvalueを持つパンダデータフレームを持っています。 value列は、最初の要素がフィールドで、2番目の要素がカウントであるタプルのリストとして値を持ちます。パンダのデータフレームを再設計する

**item value** 
item1 
item2 
item3 [('f1', 10L), ('f3', 5L)] 
item4 [('f4', 2L)] 
item5 [('f5', 1L)] 

データフレームを次の形式で展開/再設計する必要があります。

**item f1 f3 f4 f5** 
item1    
item2    
item3 10 5  
item4   2 
item5    1 

これは迅速に行うことができるパンダの機能はありますか?

答えて

2

あなたが反復可能でないリストとnp.nanの種類を混合しているので、値がリストのタプルであるならば、あなたは、型チェックを行うことができ、次にそれ以外の場合は、それを辞書を変換した後、その上にpd.Seriesを呼び出しますピボットテーブルと一緒にそれらを連結し、その後、データおよび非データの両方のために分離することにより、辞書のリストを構築このデータ論争を考えてみましょう

import numpy as np 
import pandas as pd 
lst = [np.nan, np.nan, 
     [('f1', 10), ('f3', 5)], 
     [('f4', 2)], 
     [('f5', 1)]] 

df = pd.DataFrame({"item": ["item"+str(i) for i in range(1,6)], "value": let}) 

pd.concat([df.item, df['value'].apply(lambda x: pd.Series(dict(x)) if type(x) == list else pd.Series([]))], axis = 1) 

enter image description here

+0

OPは、より一般的なソリューションを必要とする場合があります。これはf種類の任意の数との組み合わせのために、より一般化してもよいです。単純な投稿よりも多くの価値と商品があるかもしれません。 – Parfait

+0

@パルファットそれはそうです。私はOPが明確になるのを待つつもりです。 – Psidom

+0

真、それ以上の値があります。私の元のポストのものは単なるおもちゃの例です。 – learner

1

:空シリーズオブジェクトを構築します。

import numpy as np 
import pandas as pd 

df = pd.DataFrame({'item':['item1', 'item2', 'item3', 'item4', 'item5'], 
        'value':['', '', [('f1', 10), ('f3', 5)], [('f4', 2)], [('f5', 1)]]}) 

# ACTUAL DATA 
data = [{'fcols': i[0], 'value': i[1], 'item': row['item']} 
     for ix, row in df.iterrows() if len(row['value']) > 0 for i in row['value']] 
newdf = pd.DataFrame(data).pivot_table(index='item', values='value', columns='fcols').reset_index() 

# NON-DATA 
fcols = [i[0] for f in df['value'].tolist() if len(f) > 0 for i in f] 
nondata = [{'value': np.nan, 'item': row['item'], 'fcols':f} 
      for ix, row in df.iterrows() if row['value'] == '' for f in fcols]  
nondf = pd.DataFrame(nondata).pivot_table(index='item', values='value', columns='fcols').reset_index() 

# COMBINED DF 
newdf = pd.concat([nondf,newdf]).rename_axis(None, axis=1).reset_index(drop=True) 

print(newdf) 

#  item f1 f3 f4 f5 
# 0 item1 NaN NaN NaN NaN 
# 1 item2 NaN NaN NaN NaN 
# 2 item3 10.0 5.0 NaN NaN 
# 3 item4 NaN NaN 2.0 NaN 
# 4 item5 NaN NaN NaN 1.0 
関連する問題