在pandas中,一旦满足条件,是否有方法将col中的值递增1?

xtfmy6hx  于 2023-04-28  发布在  其他
关注(0)|答案(2)|浏览(91)

我希望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))
ybzsozfc

ybzsozfc1#

你很接近了,你只需要groupby:

df0['PON'] = (((df0['Mode'].shift(1) != 'SD') & (df0['Mode']=='SD'))
  .groupby(df0['LID']).cumsum()
  .add(df0['LID'].map(refrence_dict)+1)
)

输出:

LID Mode  PON
0    A   FS  101
1    A   SD  102
2    A   SD  102
3    A   FS  102
4    A   SD  103
5    B   SD   81
6    B   FS   81
7    B   FS   81
8    B   FS   81
9    B   SD   82
10   C   SD   31
11   C   FS   31
12   C   SD   32
13   C   SD   32
14   C   FS   32
gab6jxml

gab6jxml2#

这里是另一种方法:

(df0.assign(
    PON = df0['LID'].map(refrence_dict)
    .add(df0.groupby('LID')['Mode'].transform(lambda x: x.where(x.ne('SD').diff().ne(0)).eq('SD').cumsum()))))

输出:

LID Mode  PON
0    A   FS  100
1    A   SD  101
2    A   SD  101
3    A   FS  101
4    A   SD  102
5    B   SD   81
6    B   FS   81
7    B   FS   81
8    B   FS   81
9    B   SD   82
10   C   SD   31
11   C   FS   31
12   C   SD   32
13   C   SD   32
14   C   FS   32

相关问题