3

メソッドを使用して、いくつかの行エントリを列にピボットする Pandas DataFrame があります(この質問unstack()でアドバイスされているように)。そのためには、ピボットされていない列を使用し、call を呼び出して、本当に必要なデータフレームを取得します。set_indexunstack()

ただし、インデックスの一部の要素が NaN の場合、厄介なエラーが発生します。インデックスに重複したエントリがあると言われることがありますが (これは正しくありません)、NaN を整数に変換できないと言われることもあります。ここに例があります

import pandas
from numpy import nan

df = pandas.DataFrame(
    {'agent': {
                      17263: 'Hg',
                      17264: 'U',
                      17265: 'Pb',
                      17266: 'Sn',
                      17267: 'Ag',
                      17268: 'Hg'},
    'change': {
                      17263: nan,
                      17264: 0.0,
                      17265: 7.070e-06,
                      17266: 2.3614e-05,
                      17267: 0.0,
                      17268: -0.00015},
    'dosage': {
                      17263: nan,
                      17264: nan,
                      17265: nan,
                      17266: 0.0133,
                      17267: 0.0133,
                      17268: 0.0133},
    's_id': {
                      17263: 680585148,
                      17264: 680585148,
                      17265: 680585148,
                      17266: 680607017,
                      17267: 680607017,
                      17268: 680607017}}
            )
try:
    dupe = df.copy().set_index(['s_id','dosage','agent'])
    badDupe = dupe.unstack()
except Exception as e:
    print( 'Error with all data was: %s'%(e,) )
try:
    getnan = df.ix[17264:].copy().set_index(['s_id','dosage','agent'])
    badNan = getnan.unstack()
except Exception as e:
    print( 'Error dropping first entry was: %s'%(e,) )
df.dosage[:3]=42
willWork = df.copy().set_index(['s_id','dosage','agent'])
u = willWork.unstack()
print(u)

その出力は

Error with all data was: Index contains duplicate entries, cannot reshape
Error dropping first entry was: cannot convert float NaN to integer

                   change                                 
agent                  Ag       Hg        Pb        Sn   U
s_id      dosage                                          
680585148 42.0000     NaN      NaN  0.000007       NaN   0
680607017 0.0133        0 -0.00015       NaN  0.000024 NaN

ご覧のとおり、dose を NaN (ここでは 42) 以外に設定すると、再形成操作は正常に機能します。

私が求める再形成されたデータフレームを取得する最良の方法は何ですか? 投与量にセンチネル値を入れて、後で代用する必要がありますか? それは…エレガントではないようです。

4

1 に答える 1

0

なしで pandas 0.16 バージョンでコードを実行するとdf.dosage[:3]=42、次のように動作します。

In [1405]: u
Out[1405]: 
                 change                                 
agent                Ag       Hg        Pb        Sn   U
s_id      dosage                                        
680585148 NaN       NaN      NaN  0.000007       NaN   0
680607017 0.0133      0 -0.00015       NaN  0.000024 NaN
于 2015-04-30T19:46:58.003 に答える