替换熊猫中列表中的缺失值

时间:2018-08-10 04:47:44

标签: python pandas

我有一个这样的数据框

                       A           B

2018-02-01 00:00:00 5.592860    2.789900
2018-02-01 00:15:00 5.288981    2.054017
2018-02-01 00:30:00 5.319665    2.232686
2018-02-01 00:45:00 5.198657    2.236154
2018-02-01 01:00:00 5.018134    2.064312

A列将没有任何缺失值,但B列将具有。

我还有另一个这样的列表,长度为12,称为预报

[0.09545173 0.09946214 0.10596157 0.12075519 0.14446978 0.16848372
  0.20479251 0.23742175 0.26723814 0.29389328 0.30628437 0.3140854 ]

我想遍历数据帧中的每一行,并检查接下来的12行是否有任何nan。如果存在nan,请从列表中的相应索引中替换该值。

如果当前索引的第二行是nan,则将nan替换为forecasts[2]

为了使事情更清楚

我将有一个数据框,其中包含我说过的问题的数据。列B中可能有未命中的地方,但列A中没有。我将为每个时间戳列出12个位置。名为预报的列表将在Forecast [0]中具有当前时间戳的预测值,而在Forecast [11]中具有从现在开始的第11个时间戳。我想遍历数据集中的每个时间戳,请检查B列中数据帧的下12个位置是否存在任何难点。

如果有南,则将其替换为预测。

如何用熊猫轻松做到这一点??

3 个答案:

答案 0 :(得分:2)

您可以使用:

import pandas as pd
import numpy as np

temp=u"""A;B

2018-02-01 00:00:00;5.592860;2.789900
2018-02-01 00:15:00;5.288981;NaN
2018-02-01 00:30:00;5.319665;2.232686
2018-02-01 00:45:00;5.198657;2.236154
2018-02-01 01:00:00;5.018134;2.064312
2018-02-01 01:15:00;5.018134;NaN
"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), sep=";", parse_dates=True)

print (df)
                            A         B
2018-02-01 00:00:00  5.592860  2.789900
2018-02-01 00:15:00  5.288981       NaN
2018-02-01 00:30:00  5.319665  2.232686
2018-02-01 00:45:00  5.198657  2.236154
2018-02-01 01:00:00  5.018134  2.064312
2018-02-01 01:15:00  5.018134       NaN

L = [0.09545173, 0.09946214, 0.10596157]
r = int(len(df) / len(L))
print (r)
2
s = pd.Series(np.tile(np.array(L), r), index=df.index)
print (s)
2018-02-01 00:00:00    0.095452
2018-02-01 00:15:00    0.099462
2018-02-01 00:30:00    0.105962
2018-02-01 00:45:00    0.095452
2018-02-01 01:00:00    0.099462
2018-02-01 01:15:00    0.105962
dtype: float64

df['B'] = df['B'].fillna(s)
print (df)
                            A         B
2018-02-01 00:00:00  5.592860  2.789900
2018-02-01 00:15:00  5.288981  0.099462
2018-02-01 00:30:00  5.319665  2.232686
2018-02-01 00:45:00  5.198657  2.236154
2018-02-01 01:00:00  5.018134  2.064312
2018-02-01 01:15:00  5.018134  0.105962

答案 1 :(得分:0)

或单线列表理解:

df['B'] = [l[i] if type(v)==type(np.nan) else v for i,v in enumerate(df['B'].tolist())]

答案 2 :(得分:-1)

这是处理或使用缺失或未知值的基本问题。 您可以使用 fillna()函数用所需的默认值填充缺失的值。

例如:如果df1是您的数据框,其中包含多个列中的缺失值。

for column in df1:
    print("column ",column)
    df1[column] = df1[column].fillna(0.12345)

要检查 fillna 语法和示例,请检查https://kite.com/python/docs/pandas.core.frame.DataFrame.fillna

您还可以使用熊猫 isna()函数检查缺少值的地方。