3

我有一个 Pandas DataFrame,我正在使用该方法将一些行条目旋转到列中(如本问题unstack()中所建议的那样)。为此,我使用未透视的列,然后调用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

如您所见,如果我将剂量设置为 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 回答