gpt4 book ai didi

python - 填充 Pandas 数据框中缺失的中间值

转载 作者:太空宇宙 更新时间:2023-11-04 05:28:46 24 4
gpt4 key购买 nike

我有一个 pandas 数据框 df as

Date  cost    NC
20 5 NaN
21 7 NaN
23 9 78.0
25 6 80.0

现在我需要做的是填充缺失的日期,因此仅当前一行中有数字时才用值填充列 x。那就是我想要这样的输出

Date  cost    NC
20 5 NaN
21 7 NaN
22 x NaN
23 9 78.0
24 x x
25 6 80.0

请参阅日期 22 丢失且 21 日 NC 丢失,因此在 22 日 cost 分配给 x 但 NC 分配给 NaN。现在将 Date 列设置为 index 并将其reindex 设置为缺失值我可以到这里

Date  cost    NC 
20 5.0 NaN
21 7.0 NaN
22 NaN NaN
23 9.0 78.0
24 NaN NaN
25 6.0 80.0

但我无法获得最终输出。如果你这样想,它就像 ffill() 但不是从上一行填充你必须把 x 放在这里。

我还有一个问题。这里我有一个像这样的数据框 df

Date type  cost
10 a 30
11 a 30
11 b 25
13 a 27

在这里我也必须填补缺失值并像这样

Date type cost
10 a 30
11 a 30
11 b 25
12 a 30
12 b 25
13 a 27

如您所见,日期 11 有 2 个数据行,因此都被复制到 12。我为这个问题编写了这个程序

missing=[12]
for i in missing:
new_date=i
i-=1 #go to previous date
k=df[df["Date"] == i].index.tolist()[-1]+1 #index where to be filled
data=pd.DataFrame(df[df["Date"] == i].values,columns=df.columns)
data["Date"]=new_date
df=pd.concat([df.iloc[:k],data,df.iloc[k:]]).reset_index(drop=True)

现在对于大型数据集,上述程序需要花费大量时间,因为每次都必须找到索引并连接 3 个数据帧。有没有更好更有效的方法来解决这个问题?

最佳答案

我认为没有办法只填充“中间”值,但这里有一种方法(使用 ffillbfill填充):

In [11]: df1  # assuming Date is the index via df.set_index("Date")
Out[11]:
cost NC
Date
20 5 NaN
21 7 NaN
23 9 78.0
25 6 80.0

In [12]: df2 = df1.reindex(np.arange(20,27))
# 26 is sufficient, but let's see it working!

In [13]: df2
Out[13]:
cost NC
Date
20 5.0 NaN
21 7.0 NaN
22 NaN NaN
23 9.0 78.0
24 NaN NaN
25 6.0 80.0
26 NaN NaN

您不想填写“外部”NaN,这可以通过以下方式获得:

In [14]: df2.bfill().notnull() & df2.ffill().notnull()
Out[14]:
cost NC
Date
20 True False
21 True False
22 True False
23 True True
24 True True
25 True True
26 False False

现在,我们可以更新这些(如果它们用 fillna 更新):

In [15]: df2[df2.bfill().notnull() & df2.ffill().notnull()] = df2.fillna(0) # x = 0

In [16]: df2
Out[15]:
cost NC
Date
20 5.0 NaN
21 7.0 NaN
22 0.0 NaN
23 9.0 78.0
24 0.0 0.0
25 6.0 80.0
26 NaN NaN

要(部分地)回答第二个问题,IMO 在这种情况下从一个支点开始总是更好(这会给你一个更好的起点):

In [21]: df
Out[21]:
Date type cost
0 10 a 30
1 11 a 30
2 11 b 25
3 13 a 27

In [22]: df.pivot_table("cost", "Date", "type")
Out[22]:
type a b
Date
10 30.0 NaN
11 30.0 25.0
13 27.0 NaN

也许您希望从那里向前补位? (并在必要时展开)。

关于python - 填充 Pandas 数据框中缺失的中间值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37821653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com