簡體   English   中英

如何向前填充 dataframe 列,其中填充的行數限制基於另一列中單元格的值?

[英]How can I forward fill a dataframe column where the limit of rows filled is based on the value of a cell in another column?

所以我試圖轉發填充一列,限制是另一列中的值。 這是我運行的代碼,我收到此錯誤消息。

import pandas as pd
import numpy as np

df = pd.DataFrame()

df['NM'] = [0, 0, 1, np.nan, np.nan, np.nan, 0]

df['length'] = [0, 0, 2, 0, 0, 0, 0]

print(df)

   NM      length
0  0.0       0
1  0.0       0
2  1.0       2
3  NaN       0
4  NaN       0
5  NaN       0
6  0.0       0

df['NM'] = df['NM'].fillna(method='ffill', limit=df['length'])

print(df)

ValueError:限制必須是 integer

我想要的 dataframe 看起來像這樣:

       NM      length
    0  0.0       0
    1  0.0       0
    2  1.0       2
    3  1.0       0
    4  1.0       0
    5  NaN       0
    6  0.0       0

提前感謝您提供的任何幫助!

我認為您不想在此實例中使用 ffill 。

相反,我建議過濾到長度大於 0 的位置,然后遍歷這些行以在接下來的 n+length 行中輸入該行的 NM 值。

for row in df.loc[df.length.gt(0)].reset_index().to_dict(orient='records'):
    df.loc[row['index']+1:row['index']+row['length'], 'NM'] = row['NM']

為了更好地打破這一點:

  1. 獲取包含更改信息的行一定要包含索引。

    df.loc[df.length.gt(0)].reset_index().to_dict(orient='records')

  2. 遍歷它們...出於對大型數據集的性能原因,我更喜歡 to_dict。 這是一種習慣。

  3. 將 NM 行設置為具有定義長度的行的 NM 值。

您可以先將 dataframe 按length列分組再填充。 唯一的問題是,對於您的示例limit中的第一組,限制為 0 會導致錯誤,因此我們可以確保它至少為 1 和max 如果在length的第一個非零值之前有nan值,這可能會導致意外結果,但從給定的數據來看,不清楚是否會發生這種情況。

# make groups
m = df.length.gt(0).cumsum()

# fill the column
df["NM"] = df.groupby(m).apply(
                    lambda f: f.NM.fillna(
                    method="ffill", 
                    limit=max(f.length.iloc[0], 1))
).values

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM