2017-04-19 9 views
1

私は購入、および売る値のデータフレームを持っており、そのデータフレームにpivot_tableを行うことは作品の各日付のすべての売り/買い値を取得するために動作が異なります。パンダpivot_tableは少し異なるデータ

data = [('20170325', 'Buy', 400), 
     ('20170325', 'Buy', 401), 
     ('20170323', 'Buy', 400), 
     ('20170324', 'Sell', 400)] 

testDf = pd.DataFrame(data, columns=['Date', 'Scenario', 'Value']) 
df1 = pd.pivot_table(testDf, columns='Scenario', index='Date', values='Value', 
        fill_value = '', aggfunc=lambda x: x.tolist() if len(x)>1 else x) 
df1 
# Scenario   Buy Sell 
# Date      
# 20170323   400  
# 20170324    400 
# 20170325 [400, 401] 

私のデータはビットを変更した場合でも、pivot_tableでエラーが発生します:ValueErrorを:機能を減らすことはありません。理由を理解できません。ここでは異なるデータのエラーがあります。 日付のがに変更されています。

data = [('20170321', 'Buy', 400), 
     ('20170321', 'Buy', 401), 
     ('20170323', 'Buy', 400), 
     ('20170324', 'Sell', 400)] 

testDf = pd.DataFrame(data, columns=['Date', 'Scenario', 'Value']) 
df1 = pd.pivot_table(testDf, columns='Scenario', index='Date', values='Value', 
        fill_value = '',aggfunc=lambda x: x.tolist() if len(x)>1 else x) 

Traceback (most recent call last): File "", line 1, in
File "ext2\vc12_win32\lib\python2.7\site-packages\pandas\tools\pivot.py", line 114, in pivot_table
File "ext2\vc12_win32\lib\python2.7\site-packages\pandas\core\groupby.py", line 729, in agg
File "ext2\vc12_win32\lib\python2.7\site-packages\pandas\core\groupby.py", line 2978, in aggregate
File "ext2\vc12_win32\lib\python2.7\site-packages\pandas\core\groupby.py", line 1227, in _python_agg_general
File "ext2\vc12_win32\lib\python2.7\site-packages\pandas\core\groupby.py", line 1733, in agg_series
File "ext2\vc12_win32\lib\python2.7\site-packages\pandas\core\groupby.py", line 1767, in _aggregate_series_pure_python
ValueError: Function does not reduce

+0

@ScottBostonは以下のとおり述べて、そのエラーが両方のデータセットで発生します。 – Parfait

答えて

0

私はまた、あなたの最初のデータセットと同じエラーを得ました。私はこれが1日の重複価値によるものだと信じています。

これは、このからパンダの特徴であると思わSO post.

の代わりにタプルを使用するために)(あなたのToListメソッドを変換してみましょう。

df1 = pd.pivot_table(testDf, columns='Scenario', index='Date', values='Value', fill_value = '',aggfunc=lambda x: tuple(x)) 
+0

しかし、lambda x:tuple(x)をlen(x)> 1 else xとした場合は、どのように動作するのでしょうか? – jezrael

+0

混在している可能性があり、やはり削減していない可能性があるため、動作しないと思います。最終的に条件付きでもそれを殺すわけではありません。 –

+0

@ScottBoston Tupleが動作します。しかし、リストがなぜそうでないのか不思議です。奇妙なことに、私の最初のデータセットには何のエラーもありません。パンダ版とは何か関係ありますか?私はv0.17.1を使用しています。 – Nilanjan

1

pivotでさえgroupbyを考えてみましょう:

df1 = testDf.groupby(['Date', 'Scenario'])['Value'].apply(lambda x: list(x)).reset_index()\ 
      .pivot(index='Date', columns='Scenario', values='Value').fillna('') 

# Scenario   Buy Sell 
# Date      
# 20170323  [400]  
# 20170324    [400] 
# 20170325 [400, 401]  

# Scenario   Buy Sell 
# Date      
# 20170321 [400, 401]  
# 20170323  [400]  
# 20170324    [400] 
関連する問題