![](/img/trans.png)
[英]Backwards fill dataframe column where limit of rows filled is based on value of cell, perhaps with bfill() and limit=x
[英]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']
為了更好地打破這一點:
獲取包含更改信息的行一定要包含索引。
df.loc[df.length.gt(0)].reset_index().to_dict(orient='records')
遍歷它們...出於對大型數據集的性能原因,我更喜歡 to_dict。 這是一種習慣。
將 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.