Pandas(Python):用前一行值填充空单元格?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/41212273/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Pandas(Python) : Fill empty cells with with previous row value?
提问by i2_
I want to fill empty cells with with previous row value if they start with number. For example, I have
如果空单元格以数字开头,我想用前一行值填充空单元格。例如,我有
Text Text
30 Text Text
Text Text
Text Text
31 Text Text
Text Text
31 Text Text
Text Text
Text Text
32 Text Text
Text Text
Text Text
Text Text
Text Text
Text Text
I however, want to have
然而,我想拥有
Text Text
30 Text Text
30 Text Text
30 Text Text
31 Text Text
Text Text
31 Text Text
31 Text Text
31 Text Text
32 Text Text
Text Text
Text Text
Text Text
Text Text
Text Text
I tried to reach this by using this code:
我试图通过使用以下代码来实现这一点:
data = pd.read_csv('DATA.csv',sep='\t', dtype=object, error_bad_lines=False)
data = data.fillna(method='ffill', inplace=True)
print(data)
but it did not work.
但它没有用。
Is there anyway to do this?
有没有办法做到这一点?
回答by DYZ
First, replace your empty cells with NaNs:
首先,用 NaN 替换空单元格:
df[df[0]==""] = np.NaN
Now, Use ffill()
:
现在,使用ffill()
:
df.fillna(method='ffill')
# 0
#0 Text
#1 30
#2 30
#3 30
#4 31
#5 Text
#6 31
#7 31
#8 31
#9 32
回答by jezrael
I think you can first get NaN
instead whitespaces
:
我觉得你可以先得到NaN
,而不是whitespaces
:
df.Text = df.Text[df.Text.str.strip() != '']
print (df)
Text Text.1
0 30 Text Text
1 NaN Text Text
2 NaN Text Text
3 31 Text Text
4 Text Text NaN
5 31 Text Text
6 NaN Text Text
7 NaN Text Text
8 32 Text Text
9 Text Text NaN
10 NaN Text Text
11 NaN Text Text
12 NaN Text Text
13 NaN Text Text
Then use ffill
(same as fillna
with parameter ffill
), get to_numeric
for where
for replace NaN
if not numeric forward filling NaN
, last replace NaN
by empty string by fillna
:
然后用ffill
(同fillna
带参数ffill
),获得to_numeric
了where
用于替换NaN
如果不是数字前进填充NaN
,最后更换NaN
由空字符串fillna
:
orig = df.Text.copy()
df.Text = df.Text.ffill()
mask1 = pd.to_numeric(df.Text, errors='coerce')
df.Text = df.Text.where(mask1, orig).fillna('')
print (df)
Text Text.1
0 30 Text Text
1 30 Text Text
2 30 Text Text
3 31 Text Text
4 Text Text NaN
5 31 Text Text
6 31 Text Text
7 31 Text Text
8 32 Text Text
9 Text Text NaN
10 Text Text
11 Text Text
12 Text Text
13 Text Text