Python,Pandas ffill()不适用于对象列

时间:2018-04-07 23:34:06

标签: python pandas fill

以下是示例dataFrame:

data = np.matrix([[4,3,6,4,1,7,5,5], [1,2,3,6,4,2,4,9], ['a',np.nan, np.nan, 'b', np.nan, 'c', np.nan, 'd'],[1,np.nan, np.nan, 2, np.nan, 2, np.nan, 2]]).T
data = pd.DataFrame(data)

>>> data

   0  1    2    3
0  4  1    a    1
1  3  2  nan  nan
2  6  3  nan  nan
3  4  6    b    2
4  1  4  nan  nan
5  7  2    c    2
6  5  4  nan  nan
7  5  9    d    2

>>> data.dtypes

0    object
1    object
2    object
3    object
dtype: object

如您所见,某些列的dtypesobject。它们不是floatint

如果我输入data.ffill()到控制台,则它不会执行任何操作。但是,如果我尝试data[3] = data[3].astype(float).ffill()

data更改为:

   0  1    2    3
0  4  1    a  1.0
1  3  2  nan  1.0
2  6  3  nan  1.0
3  4  6    b  2.0
4  1  4  nan  2.0
5  7  2    c  2.0
6  5  4  nan  2.0
7  5  9    d  2.0

显然pd.ffill()仅适用于数字列,但不适用于字符串列。 data[2] = data[2].astype(str).ffill()没有改变任何事情。如何使用dtype=object转发填充行?

这是我想要的输出:

   0  1    2    3
0  4  1    a  1.0
1  3  2    a  1.0
2  6  3    a  1.0
3  4  6    b  2.0
4  1  4    b  2.0
5  7  2    c  2.0
  • 我使用pd.read_csv()从csv中提取数据。在原始csv文件中,一些数值列和一些具有字符串列

1 个答案:

答案 0 :(得分:1)

如果所有字符串都只是存储为'nan',那么您可以将整个DataFrame填入一行。 None是一个可识别的空值,适用于对象类型。

data.mask(data=='nan', None).ffill()

#0    4    1    a    1
#1    3    2    a    1
#2    6    3    a    1
#3    4    6    b    2
#4    1    4    b    2
#5    7    2    c    2
#6    5    4    c    2
#7    5    9    d    2