我有一个分散在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
答案 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
对你来说重要的是你想要对相关专栏的信息做些什么。