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

Posted

技术标签:

【中文标题】熊猫(Python):用前一行值填充空单元格?【英文标题】:Pandas(Python) : Fill empty cells with with previous row value? 【发布时间】:2017-05-03 21:30:00 【问题描述】:

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

    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

但是,我想拥有

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

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

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

但它不起作用。

有没有办法做到这一点?

【问题讨论】:

“空”单元格的值是多少? fillna 仅填充值为NaN 的单元格。要使用fillna,首先将“”替换为numpy.nan 谢谢。我用正则表达式将“空”值更改为 NaN。但它没有用。 【参考方案1】:

首先,将空单元格替换为 NaN:

df[df[0]==""] = np.NaN

现在,使用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

【讨论】:

它是否适用于字符串值?因为我试图用字符串的前一行值填充我的空单元格,它仍然返回NaN df[df["column_name"]==""] = np.NaN 是否正确? 不确定这是否可行,因为我正在处理类似的问题。 ffill 会填满一切。 @joasa 设置标志“就地”允许我对字符串值执行相同的操作。示例:frame[column_name].fillna(method='ffill', inplace=True) 我认为第一行应该是np.nan rathar 而不是np.NaN。出于某种原因,我的代码将np.Nan 视为字符串,将np.nan 视为真正的nan。【参考方案2】:

我想你可以先得到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

然后使用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

【讨论】:

非常感谢。但是,当我运行您的代码时,我得到以下信息:第 2672 行,在 getattr return object.__getattribute__(self, name) AttributeError: 'DataFrame' object has no attribute 'Text' 我不明白 .Text 是什么方法。 (我写了 Text 但实际上有一些字符串值)。 文本为列名,请尝试使用df.col1df['col 1']

以上是关于熊猫(Python):用前一行值填充空单元格?的主要内容,如果未能解决你的问题,请参考以下文章

如何在python pandas中用0填充空单元格[重复]

如果行具有相同的“A 列”值,则用最后一个已知值填充空的“B 列”单元格

将值写入python中熊猫工作表中的特定单元格

Excel VBA:用相邻的单元格值填充空单元格

SQL查询不等于空白值如何写

Excel vba 仅自动填充空单元格