【问题标题】:Pandas: clean up DataFrame filled with NaN'sPandas:清理填充了 NaN 的 DataFrame
【发布时间】:2017-06-01 19:48:10
【问题描述】:

我有一个 DataFrame,其中散布着 NaNs。我在 Pandas 文档 (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html) 中读到 pd.dropna 应该删除所有 NaNs 但它不适用于我的 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

理想情况下,我希望看到所有鱼类按原样排成一列,并将其相应的重量排成一列。我认为删除所有 NaNs 可以实现这一点,但我没有使用 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     

【问题讨论】:

  • 请提供一个小样本输出,因为有多种方法可以从 df 中删除 NaN
  • 对不起,小样本输出是什么意思?输出到底是什么?
  • 想要的结果应该是什么样子
  • 好的,刚刚添加了它应该是什么样子

标签: python pandas numpy dataframe


【解决方案1】:

让我们做一个简单的例子。

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

对你来说重要的是你想用相关列的信息做什么。

【讨论】:

  • 这是一个非常明确的答案,但它并不能解决我的问题,因为如果我将其缩小到每行的最大值,那将会遗漏很多有价值的数据......我认为您在前几句话中直接回答了我的问题,如果不删除整行,我就无法删除 NaN。臭死了。我想我得回去,也许尝试删除所有空字符串的列表条目。
  • 当您不想评估不完整的数据时,dropna 命令有效。如果要根据不完整的数据填充空白字段,可以使用其他方法,例如fillnainterpolate,您可以在其中选择要填充数据的方式(最近邻、线性或三次插值等)。此外,max 方法只是一个建议的方法,您可以使用其他方法或使用您自己的自定义函数使用命令apply 创建您自己的方法。祝你的代码好运! ;)
猜你喜欢
  • 2015-02-14
  • 1970-01-01
  • 2020-11-14
  • 2016-12-03
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多