python - 使用给定值填充 pandas DataFrame 到第一个数据点和最后一个数据点

标签 python pandas dataframe

采用以下测试数据帧:

test_df = pd.DataFrame({'col_a' : [np.nan, np.nan, 4.0, 5.0, 12.0, 45.0, 86.0, 92.0, np.nan, np.nan, np.nan]})
test_df

    col_a
0   NaN
1   NaN
2   4.0
3   5.0
4   12.0
5   45.0
6   86.0
7   92.0
8   NaN
9   NaN
10  NaN

现在我想用值 0.0 填充 col_a 中的所有 NA,直到第一个数据点 (4.0)。

我还想用值 100.0 替换最新数据点 (92.0) 的所有 NA。

fillna 的关键字valuemethod 的组合方法似乎并不像我最初希望的那样有效。

你能帮忙吗?越pythonic越好。谢谢。

++++++++

编辑

事实上,我可以从填充数据框的顶部开始,如下所示:

test_df.loc[0:test_df['col_a'].first_valid_index()] = test_df.loc[0:test_df['col_a'].first_valid_index()].fillna(value=0)

然后使用 fillna 方法替换剩下的 NA,但是它非常丑陋并且难以处理无数列和其他数据帧约束。

++++++++

最佳答案

cumsum 创建的助手系列赋值由 cumsum 创建的最大值,然后通过 minmax 的比较创建掩码,但对于 max 是必需的 shift省略最后一个非 NaN 值:

a = test_df['col_a'].notnull().cumsum()
print (a)
0     0
1     0
2     1
3     2
4     3
5     4
6     5
7     6
8     6
9     6
10    6
Name: col_a, dtype: int32

test_df[a == a.min()] = 0
test_df[a.shift() == a.max()] = 100
print (test_df)
    col_a
0     0.0
1     0.0
2     4.0
3     5.0
4    12.0
5    45.0
6    86.0
7    92.0
8   100.0
9   100.0
10  100.0

关于python - 使用给定值填充 pandas DataFrame 到第一个数据点和最后一个数据点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48640509/

相关文章:

python - 如果任何列值不在 pandas 的列表中,则删除组

python - 使用具有空列表属性的 pandas.io.json.json_normalize()

r - 根据ngrams的长度逐行子集数据

python - 删除不是二元组或三元组的关键字(Yake)

Python 不接受导入模块名称为 '-'

python - 添加新行以在 python 中打印 csv 的列输出

python - 使用 Python PIL 库将图像垂直淡化为透明

python - 如何在 Pandas 中将数据帧堆叠在一起

python - spark- groupBy 和 sampleBy

python - 如何在 Keras 中针对不同的输出大小训练网络