gpt4 book ai didi

python - 在每一行 Pandas 中,从第一个非 NaN 开始,X 值的窗口保持不变,而所有其他值都是 NaN

转载 作者:行者123 更新时间:2023-12-05 02:45:40 26 4
gpt4 key购买 nike

StackOverflow 的公民,

我目前正在对可能有数百万行长的数据框运行迭代。在我的数据框的每一行中,我都有前导 NaN(所需),然后是值。我只想在每一行中有 X 个值,然后是 NaN。 实际上我想要一个只有 X 值的窗口,从第一个非 NaN 开始并且该行中的所有其他位置都将为 NaN。

我的解决方案非常慢。此外,我发现类似的问题没有足够的帮助(最关心的只是第一个/最后一个 NaN)。

窗口大小为 3 的示例:

import pandas as pd
import numpy as np

x = 3

data = {'2018Q3': [0, np.nan, np.nan, np.nan, np.nan],
'2018Q4': [1, np.nan, np.nan, np.nan, 10],
'2019Q1': [2, 3, np.nan, np.nan, 12],
'2019Q2': [3, 4, np.nan, 8, 14],
'2019Q3': [4, 5, np.nan, 9, 22]}

df = pd.DataFrame.from_dict(data)
print(df)

2018Q3 2018Q4 2019Q1 2019Q2 2019Q3
0 0.0 1.0 2.0 3.0 4.0
1 NaN NaN 3.0 4.0 5.0
2 NaN NaN NaN NaN NaN
3 NaN NaN NaN 8.0 9.0
4 NaN 10.0 12.0 14.0 22.0

结果应如下所示:

   2018Q3  2018Q4  2019Q1  2019Q2  2019Q3
0 0.0 1.0 2.0 NaN NaN
1 NaN NaN 3.0 4.0 5.0
2 NaN NaN NaN NaN NaN
3 NaN NaN NaN 8.0 9.0
4 NaN 10.0 12.0 14.0 NaN

我的解决方案:

def cut_excess_forecast(num_x, dataf): 
Total_Col = len(dataf.columns.values) # total columns
df_NEW = pd.DataFrame()
for index, row in dataf.iterrows():
nas = row.isnull().sum(axis =0) # number of nulls
good_data = nas + num_x # gives number of columns that should be untouched
if good_data >= Total_Col: # if number of columns to not be touched > available columns, pass
pass # all data available is needed
else:
cutoff = Total_Col-good_data
row[-cutoff:] = np.nan #change to NaN excess columns in this row

df_NEW = df_NEW.append(row.copy()) #append changed row to new index
df_NEW.index = dataf.index #move over original index to the new dataframe
return df_NEW.copy()

df2 = cut_excess_forecast(x, df)
print(df2)

允许排序,只要索引不变。提前干杯和感谢。

最佳答案

尝试:

df.where(df.notna().cumsum(1)<4)

输出:

   2018Q3  2018Q4  2019Q1  2019Q2  2019Q3
0 0.0 1.0 2.0 NaN NaN
1 NaN NaN 3.0 4.0 5.0
2 NaN NaN NaN NaN NaN
3 NaN NaN NaN 8.0 9.0
4 NaN 10.0 12.0 14.0 NaN

解释:

  1. df.notna()掩盖 NaN False 的值和非 NaN True 的值.
   2018Q3  2018Q4  2019Q1  2019Q2  2019Q3
0 True True True True True
1 False False True True True
2 False False False False False
3 False False False True True
4 False True True True True
  1. 将其与 cumsum(1) 链接起来将计算非 NaN行上从左到右的值。
   2018Q3  2018Q4  2019Q1  2019Q2  2019Q3
0 1 2 3 4 5
1 0 0 1 2 3
2 0 0 0 0 0
3 0 0 0 1 2
4 0 1 2 3 4
  1. 然后我们比较<4掩盖计数超过阈值的地方 4False
   2018Q3  2018Q4  2019Q1  2019Q2  2019Q3
0 True True True False False
1 True True True True True
2 True True True True True
3 True True True True True
4 True True True True False
  1. 最后将它包裹在 .where 周围用 np.NaN 掩盖这些细胞.

关于python - 在每一行 Pandas 中,从第一个非 NaN 开始,X 值的窗口保持不变,而所有其他值都是 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65836235/

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