我希望PON列以df['LID']
作为键从refrence_dict
填充,并根据条件(即
conditions = [(dff['Mode'].shift(1) != 'SD') & (dff['Mode']=='SD')]
我的dataframe是:
refrence_dict={'A': 100, 'B': 80, 'C': 30, 'D': 400}
df0 = pd.DataFrame({'LID': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'],
'Mode': ['FS', 'SD', 'SD', 'FS', 'SD', 'SD', 'FS', 'FS', 'FS', 'SD', 'SD', 'FS', 'SD', 'SD', 'FS']})
我想要的是:
df1 = pd.DataFrame({'LID': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'],
'Mode': ['FS', 'SD', 'SD', 'FS', 'SD', 'SD', 'FS', 'FS', 'FS', 'SD', 'SD', 'FS', 'SD', 'SD', 'FS'],
'PON': [100, 101, 101, 101, 102, 81, 81, 81, 81, 82, 31, 31, 32, 32, 32 ]})
到目前为止,我所尝试的是:按LID
对值进行排序,然后从refrence_dict
填充新的临时列PON_tmp
,然后仅当条件为真时才用PON_temp
中的值填充PON
列;最后,我在PON
列上使用了cumsum()
,但不是递增1,而是将值相加。
上述步骤的代码:
def sort_values(df):
print(f"\nSorting values")
df.sort_values(by=['LID'], inplace=True,)
return df
def replace_po(df):
df["PON_tmp"]=df["LID"].replace(refrence_dict)
return df
def op_cumsum(df):
df['PON'] = df.groupby(['LID'])['PO'].cumsum()
return df
def process_1(df, val):
conditions = [(df['Mode'].shift(1) != val) & (df['Mode']==val)]
aggregation = {'reboot_rate': ('Mode','size')}
choices = [df['PON_tmp']]
df['PO']= np.select(conditions, choices, default=np.NAN )
return df
dfm = (df0.
pipe(sort_values).
pipe(replace_po). #create new col PON_tmp
pipe(process_1, 'SD').
pipe(op_cumsum))
2条答案
按热度按时间ybzsozfc1#
你很接近了,你只需要groupby:
输出:
gab6jxml2#
这里是另一种方法:
输出: