Pandas(Python):使用前一行值填充空单元格?

i2_*_*i2_ 7 python python-3.x pandas

如果以数字开头,我想用前一行值填充空单元格.例如,我有

    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
Run Code Online (Sandbox Code Playgroud)

但是,我希望拥有

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
Run Code Online (Sandbox Code Playgroud)

我试图通过使用此代码达到此目的:

data = pd.read_csv('DATA.csv',sep='\t', dtype=object, error_bad_lines=False)
data = data.fillna(method='ffill', inplace=True)
print(data)
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

反正有没有这样做?

DYZ*_*DYZ 21

首先,用NaN替换空单元:

df[df[0]==""] = np.NaN
Run Code Online (Sandbox Code Playgroud)

现在,使用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
Run Code Online (Sandbox Code Playgroud)

  • 它适用于字符串值吗?因为我试图用字符串形式的前一行值填充我的空单元格,它仍然返回“NaN”。 (5认同)
  • @joasa 将标志设置为“就地”允许我对字符串值执行相同的操作。示例:``frame[column_name].fillna(method='ffill', inplace=True)``` (4认同)

jez*_*ael 8

我觉得你可以先得到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
Run Code Online (Sandbox Code Playgroud)

然后用ffill(同fillna带参数ffill),获得to_numericwhere用于替换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
Run Code Online (Sandbox Code Playgroud)