熊猫:清理填充NaN的DataFrame

时间:2017-06-01 19:48:11

标签: python pandas numpy dataframe

我有一个分散在NaN的DataFrame。我在Pandas文档(http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html)中阅读,pd.dropna应该删除所有NaN,但它不能处理我的DataFrame。

这是我的数据:

fish_frame:                         0       1       2         3  \
0                   735-8     NaN     NaN       NaN   
1                     NaN     NaN     NaN  LIVE WGT   
2                 GBE COD     NaN     NaN       600   
3                 GBW COD     NaN  11,189       NaN   
4                 GOM COD     NaN       0       NaN   
5                 POLLOCK     NaN     NaN     1,103   
6                   WHAKE     NaN     NaN        12   
7             GBE HADDOCK     NaN  10,730       NaN   
8             GBW HADDOCK     NaN  64,147       NaN   
9             GOM HADDOCK     NaN       0       NaN   
10                REDFISH     NaN     NaN         0   
11         WITCH FLOUNDER     NaN     370       NaN   
12                 PLAICE     NaN     NaN       622   
13     GB WINTER FLOUNDER  54,315     NaN       NaN   
14    GOM WINTER FLOUNDER     653     NaN       NaN   
15  SNEMA WINTER FLOUNDER  14,601     NaN       NaN   
16          GB YELLOWTAIL     NaN   1,663       NaN   
17       SNEMA YELLOWTAIL     NaN   1,370       NaN   
18       CCGOM YELLOWTAIL   1,812     NaN       NaN   

                            4   5      6   7  ASK           TRADE_DATE  \
0                         NaN NaN    NaN NaN    1  2013-05-15 10:09:00   
1                         NaN NaN  TOTAL NaN    1  2013-05-15 10:09:00   
2                         NaN NaN    NaN NaN    1  2013-05-15 10:09:00   
3                         NaN NaN    NaN NaN    1  2013-05-15 10:09:00   
4   Package Deal - $40,753.69 NaN   None NaN    1  2013-05-15 10:09:00   
5                         NaN NaN    NaN NaN    1  2013-05-15 10:09:00   
6                         NaN NaN    NaN NaN    1  2013-05-15 10:09:00   
7                         NaN NaN    NaN NaN    1  2013-05-15 10:09:00   
8                         NaN NaN    NaN NaN    1  2013-05-15 10:09:00   
9                         NaN NaN    NaN NaN    1  2013-05-15 10:09:00   
10                        NaN NaN    NaN NaN    1  2013-05-15 10:09:00   
11                        NaN NaN    NaN NaN    1  2013-05-15 10:09:00   
12                        NaN NaN    NaN NaN    1  2013-05-15 10:09:00   
13                        NaN NaN   None NaN    1  2013-05-15 10:09:00   
14                        NaN NaN   None NaN    1  2013-05-15 10:09:00   
15                        NaN NaN   None NaN    1  2013-05-15 10:09:00   
16                        NaN NaN    NaN NaN    1  2013-05-15 10:09:00   
17                        NaN NaN    NaN NaN    1  2013-05-15 10:09:00   
18                        NaN NaN   None NaN    1  2013-05-15 10:09:00

理想情况下,我希望看到所有鱼类在一列中排成一列,并将它们相应的重量排列在一列中。我认为删除所有NaN s会实现这一点,但我没有使用行fish_frame.dropna()这样做。

任何帮助都将不胜感激,谢谢。

理想的打印输出看起来像这样:

fish_frame2:                         0       1       2         3  \
0                   735-8        
1                       LIVE WGT   
2                 GBE COD     600   
3                 GBW COD     11,189       
4                 GOM COD     0       
5                 POLLOCK     1,103   
6                   WHAKE     12   
7             GBE HADDOCK     10,730       
8             GBW HADDOCK     64,147       
9             GOM HADDOCK     0       
10                REDFISH     0   
11         WITCH FLOUNDER     370       
12                 PLAICE     622   
13     GB WINTER FLOUNDER     54,315     
14    GOM WINTER FLOUNDER     653     
15  SNEMA WINTER FLOUNDER     14,601       
16          GB YELLOWTAIL     1,663       
17       SNEMA YELLOWTAIL     1,370       
18       CCGOM YELLOWTAIL     1,812     

1 个答案:

答案 0 :(得分:2)

我们举一个简单的例子。

import pandas as pd
import numpy as np
np.random.seed(4)
A=np.random.rand(6,4)
A=np.where(A<.7, np.nan,A)
df = pd.DataFrame(A)
print(df)
# result:
#           0         1         2         3
# 0  0.967030       NaN  0.972684  0.714816
# 1       NaN       NaN  0.976274       NaN
# 2       NaN       NaN  0.779383       NaN
# 3  0.862993  0.983401       NaN       NaN
# 4       NaN       NaN       NaN  0.956653
# 5       NaN  0.948977  0.786306  0.866289

Dropna将删除所有信息,因为所有行都包含至少一个NAN。 dropna将删除包含至少一个NAN的所有行。

根据您对数据的处理方式,您必须对其进行二次采样。在你的情况下,列1到7.在我的情况下,我将从1到3。

sub = df[[i for i in range(1,4)]] # in your case 1 to 7
print(sub)
# result:
#           1         2         3
# 0       NaN  0.972684  0.714816
# 1       NaN  0.976274       NaN
# 2       NaN  0.779383       NaN
# 3  0.983401       NaN       NaN
# 4       NaN       NaN  0.956653
# 5  0.948977  0.786306  0.866289

对数据进行二次采样后,您可以选择要对数据执行的操作,比方说,使用您将执行以下操作的每一行的最大值:

print(sub.max(axis=1))
# result:
# 0    0.972684
# 1    0.976274
# 2    0.779383
# 3    0.983401
# 4    0.956653
# 5    0.948977
# dtype: float64

您还可以使用其他方法,例如min,或者如果您想要自定义和更复杂的方法,可以使用函数apply。

def first_element(x):
    if x.first_valid_index() is None:
        return None
    else:
        return x[x.first_valid_index()]

sub2=sub.apply(first_element,axis=1)
print(sub2)
# result
# 0    0.972684
# 1    0.976274
# 2    0.779383
# 3    0.983401
# 4    0.956653
# 5    0.948977

对你来说重要的是你想要对相关专栏的信息做些什么。