pandas.DataFrame.interpolate允许通过插入相邻值来填充缺失数据。在它接受的论点中,其中两个似乎与这个问题相关:method和limit。
method:除其他可能的值外,接受"linear"和"time"。它们之间的区别在于"linear"假设等距行并忽略索引,而"time"插值则考虑索引定义的时间间隔>>> df = pd.DataFrame({'vals': [11, np.nan, np.nan, 12, np.nan, 22]},\n... index=pd.to_datetime(['2020-02-02 11:00', '2020-02-02 11:06', '2020-02-02 11:30',\n... '2020-02-02 12:00', '2020-02-02 16:00', '2020-02-02 22:00']))\n>>> df.assign(interp_linear=df.interpolate(method='linear'),\n... interp_time=df.interpolate(method='time'))\n\n\xef\xbb\xbf vals interp_linear interp_time\n2020-02-02 11:00:00 11.0 11.000000 11.0\n2020-02-02 11:06:00 NaN 11.333333 11.1\n2020-02-02 11:30:00 NaN 11.666667 11.5\n2020-02-02 12:00:00 12.0 12.000000 12.0\n2020-02-02 16:00:00 NaN 17.000000 16.0\n2020-02-02 22:00:00 22.0 22.000000 22.0\nRun Code Online (Sandbox Code Playgroud)\nlimit:允许您根据缺失值的数量限制要使用插值填充的间隙的长度。它需要整数值,并定义为要填充的连续 NaN 的最大数量。虽然这种行为对于本案来说是绝对合理的method="linear",但对于本案来说似乎是有限的 …我有一个带有正负整数的一列的DataFrame。对于每一行,我想查看有多少连续的行(从当前行开始并包括当前行)具有负值。
因此,如果一个序列是2, -1, -3, 1, -1,结果将是0, 2, 1, 0, 1。
我可以通过遍历所有索引,使用.iloc拆分列以及next()找出下一个正值在哪里来做到这一点。但是我觉得这并没有利用熊猫的功能,我想还有一种更好的方法。我已经尝试过使用.shift(),expanding_window但没有成功。
有没有一种更“泛泛的”方式来找出当前行满足某个逻辑条件之后连续多少行?
这是现在正在工作的内容:
import pandas as pd
df = pd.DataFrame({"a": [2, -1, -3, -1, 1, 1, -1, 1, -1]})
df["b"] = 0
for i in df.index:
sub = df.iloc[i:].a.tolist()
df.b.iloc[i] = next((sub.index(n) for n in sub if n >= 0), 1)
Run Code Online (Sandbox Code Playgroud)
编辑:我意识到,当结尾处有多个负值时,即使我自己的示例也不起作用。因此,有必要提供更好的解决方案。
编辑2:我说这个问题在整数的条件,但原本只把1和-1我的例子。我通常需要求解正整数和负整数。
大熊猫有没有办法只插入一个缺失的数据点?也就是说,如果有2个以上连续的NaN,我想让它们独自一人.
所以,举个例子:
s = pd.Series([1, None, 2, 3, None, None, 4.5])
d.interpolate(limit=1)
Run Code Online (Sandbox Code Playgroud)
给我:
[ 1.0, 1.5, 2.0, 3.0, 3.5, NaN, 4.5 ]
Run Code Online (Sandbox Code Playgroud)
但是我想得到
[ 1.0, 1.5, 2.0, 3.0, NaN, NaN, 4.5 ]
Run Code Online (Sandbox Code Playgroud)
如果它有帮助,我有一个索引列表,其中只有一个缺失值.