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]