Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用熊猫的数字顺序填充NA_Python_Numpy_Pandas - Fatal编程技术网

Python 用熊猫的数字顺序填充NA

Python 用熊猫的数字顺序填充NA,python,numpy,pandas,Python,Numpy,Pandas,我有一个熊猫数据框,如下所示: LogdiffT Year Country 0 -0.003094 2002 Australia 1 -0.015327 2001 NaN 2 0.100617 2000 NaN 3 0.067728 1999 NaN 4 0.089962 2010 China 5 -0.041844 2009 NaN 6 -0.031013 2008 Na

我有一个熊猫数据框,如下所示:

    LogdiffT    Year    Country
0   -0.003094   2002    Australia
1   -0.015327   2001    NaN
2   0.100617    2000    NaN
3   0.067728    1999    NaN
4   0.089962    2010    China
5   -0.041844   2009    NaN
6   -0.031013   2008    NaN
7   0.091948    2007    NaN
8   0.082764    2006    Greece
9   0.103519    2005    NaN
10  -0.048100   2004    NaN
11  -0.014992   2003    NaN
12  0.166187    1966    Japan
如果您在“国家”列下看到所有NA,并且在遇到新的国家名称之前,国家名称后面的NA都属于该国家名称。澳大利亚之后的3个NA代表澳大利亚,中国之后的3个NAs代表中国,依此类推。我想把这个变量重新编码为一个数字变量,这样所有属于一个国家的观测值都被编码为相同的。与澳大利亚的所有4个OB一样,美国+3个OB应为1,中国为2,依此类推

在SAS中,我可以按顺序操作并首先使用。最后。然后重新编码。我们如何在熊猫身上做类似的事情

有什么想法吗

编辑:

我尝试实现以下解决方案之一。这是我得到的一件有趣的事情,我不知道为什么

我的数据帧如上所示。当我运行此命令时: Country或df['Country']我得到一个错误,当有列时,没有名为Country的列

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-360-361952a0cbf3> in <module>()
      2 data_train=data_2yr[features] # Subsetting the features from original data
      3 # Recoding Country, Year variable
----> 4 data_train.Country

/Users/lib/python2.7/site-packages/pandas/core/generic.pyc in __getattr__(self, name)
   1945                 return self[name]
   1946             raise AttributeError("'%s' object has no attribute '%s'" %
-> 1947                                  (type(self).__name__, name))
   1948 
   1949     def __setattr__(self, name, value):

AttributeError: 'DataFrame' object has no attribute 'Country'

因此,我无法实施提出的解决方案。这里出了什么问题?

这里有一种方法

通过删除NAN获取唯一国家/地区列表

In [66]: country_dict = {y:x for x,y in enumerate(df['Country'].dropna().unique())}

In [67]: country_dict
Out[67]: {'Australia': 0, 'China': 1, 'Greece': 2, 'Japan': 3}
将国家/地区替换为国家/地区

然后用前面的值填充

In [70]: dff.ffill()
Out[70]:
    LogdiffT  Year  Country
0  -0.003094  2002        0
1  -0.015327  2001        0
2   0.100617  2000        0
3   0.067728  1999        0
4   0.089962  2010        1
5  -0.041844  2009        1
6  -0.031013  2008        1
7   0.091948  2007        1
8   0.082764  2006        2
9   0.103519  2005        2
10 -0.048100  2004        2
11 -0.014992  2003        2
12  0.166187  1966        3

假设您的数据帧名为df,并且您有一个嵌套的国家代码字典,如下所示。然后你可以用

调用df=df.ffill,然后调用,factorize返回数组值的元组和由系列值组成的索引,我们在这里只需要数组值:

In [476]:

df['Country'] = df['Country'].factorize()[0]
df
Out[476]:
    LogdiffT  Year  Country
0  -0.003094  2002        0
1  -0.015327  2001        0
2   0.100617  2000        0
3   0.067728  1999        0
4   0.089962  2010        1
5  -0.041844  2009        1
6  -0.031013  2008        1
7   0.091948  2007        1
8   0.082764  2006        2
9   0.103519  2005        2
10 -0.048100  2004        2
11 -0.014992  2003        2
12  0.166187  1966        3
factorize的输出:

根据@John Galt的建议,您可以将上述内容压缩成一行:

df['Country'] = df['Country'].ffill().factorize()[0]

您想要的输出是什么?显示df.columns的输出您可能嵌入了空格,您是对的。刚刚选中,国家栏显示“国家”。那是怎么发生的?。就在我导入工作表的时候?。有没有想过这样的陷阱可以避免,或者从数据框列标题中删除空格?类似于.strip类似于string?顺便说一句,我删除了excel文件本身中的空间,然后导入。所以它现在起作用了。但是,当我尝试您的解决方案时,它确实给了我一个警告:/Users/anaconda/lib/python2.7/site packages/IPython/kernel/_main__u;.py:4:SettingWithCopyWarning:试图在数据帧切片的副本上设置值。尝试使用.loc[row\u indexer,col\u indexer]=值,而不是查看文档中的警告:根据加载方式,可以执行df.columns=pd.Seriesdf.columns.str.replace“”,关于新警告,如果将命令作为两个单独的步骤运行,是否会发出警告?所以df=df.fill,然后df['Countr']=df['Countr'].factorize[0]`?啊。factorize@EdChum的答案肯定比我的+1好。注意:在应用factorize之前,您需要填写您的NaNs@JohnGalt是的,你是对的,我想当我第一次尝试这个方法时,它似乎是有效的,但我只是再次尝试,它将-1表示NaN值一个小的加法基于你的解决方案一个单一的线性可以是df['Country'].ffill.factorize[0]?我有时宁愿把答案分解成一行,因为一行可能会使人困惑,而不是对完整的dfYes应用ffill
In [476]:

df['Country'] = df['Country'].factorize()[0]
df
Out[476]:
    LogdiffT  Year  Country
0  -0.003094  2002        0
1  -0.015327  2001        0
2   0.100617  2000        0
3   0.067728  1999        0
4   0.089962  2010        1
5  -0.041844  2009        1
6  -0.031013  2008        1
7   0.091948  2007        1
8   0.082764  2006        2
9   0.103519  2005        2
10 -0.048100  2004        2
11 -0.014992  2003        2
12  0.166187  1966        3
In [480]:

df['Country'].factorize()
Out[480]:
(array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3]),
 Index(['Australia', 'China', 'Greece', 'Japan'], dtype='object'))
df['Country'] = df['Country'].ffill().factorize()[0]