2017-03-10 25 views
2

私は列= ['date'、 'id'、 'value']のDataFrameを持っています。私たちはn個の製品を持っていると仮定します。私はcolumns = ['date'、 'valueid1' ..、 'valueidn']という新しいデータフレームを作成しようとしています。値が対応する日付行に割り当てられている場合、NaNは値として割り当てられますしないでください。多くのおかげでpandasグループ日付で、値を列に割り当てます。

+0

あなたが探しています[ ' pivot() '](http://pandas.pydata.org/pandas-docs/stabl e/generated/pandas.DataFrame.pivot.html)関数を使用します。使用方法の詳細については、[pandas docs](http://pandas.pydata.org/pandas-docs/stable/reshaping.html#reshaping-by-pivoting-dataframe-objects)を参照してください。 – elcombato

答えて

3

次のDF持っていると仮定すると:

In [120]: df 
Out[120]: 
     date id value 
0 2001-01-01 1  10 
1 2001-01-01 2  11 
2 2001-01-01 3  12 
3 2001-01-02 3  20 
4 2001-01-03 1  20 
5 2001-01-04 2  30 

あなたが使用することができpivot_table()方法:

In [121]: df.pivot_table(index='date', columns='id', values='value') 
Out[121]: 
id    1  2  3 
date 
2001-01-01 10.0 11.0 12.0 
2001-01-02 NaN NaN 20.0 
2001-01-03 20.0 NaN NaN 
2001-01-04 NaN 30.0 NaN 

または

In [122]: df.pivot_table(index='date', columns='id', values='value', fill_value=0) 
Out[122]: 
id   1 2 3 
date 
2001-01-01 10 11 12 
2001-01-02 0 0 20 
2001-01-03 20 0 0 
2001-01-04 0 30 0 
1

は、私はあなたがpivotが必要だと思う:

df = df.pivot(index='date', columns='id', values='value') 

はサンプル:

df = pd.DataFrame({'date':pd.date_range('2017-01-01', periods=5), 
        'id':[4,5,6,4,5], 
        'value':[7,8,9,1,2]}) 

print (df) 
     date id value 
0 2017-01-01 4  7 
1 2017-01-02 5  8 
2 2017-01-03 6  9 
3 2017-01-04 4  1 
4 2017-01-05 5  2 

df = df.pivot(index='date', columns='id', values='value') 
#alternative solution 
#df = df.set_index(['date','id'])['value'].unstack() 
print (df) 
id   4 5 6 
date      
2017-01-01 7.0 NaN NaN 
2017-01-02 NaN 8.0 NaN 
2017-01-03 NaN NaN 9.0 
2017-01-04 1.0 NaN NaN 
2017-01-05 NaN 2.0 NaN 

が、取得した場合:

ValueError: Index contains duplicate entries, cannot reshape

meansum、のような機能を集約する必要が使用することです。 .. groupbyまたはpivot_table

df = pd.DataFrame({'date':['2017-01-01', '2017-01-02', 
          '2017-01-03','2017-01-05','2017-01-05'], 
        'id':[4,5,6,4,4], 
        'value':[7,8,9,1,2]}) 

df.date = pd.to_datetime(df.date) 
print (df) 
     date id value 
0 2017-01-01 4  7 
1 2017-01-02 5  8 
2 2017-01-03 6  9 
3 2017-01-05 4  1 <- duplicity 2017-01-05 4 
4 2017-01-05 4  2 <- duplicity 2017-01-05 4 

df = df.groupby(['date', 'id'])['value'].mean().unstack() 
#alternative solution (another answer same as groupby only slowier in big df) 
#df = df.pivot_table(index='date', columns='id', values='value', aggfunc='mean') 

print (df) 
id   4 5 6 
date      
2017-01-01 7.0 NaN NaN 
2017-01-02 NaN 8.0 NaN 
2017-01-03 NaN NaN 9.0 
2017-01-05 1.5 NaN NaN <- 1.5 is mean (1 + 2)/2 
関連する問題