检查dataframe中的每一行和每一列,并用用户定义函数替换值

2024-06-09 10:38:49 发布

您现在位置:Python中文网/ 问答频道 /正文

df=pd.DataFrame({'0':["qwa-abc","abd-xyz","abt-Rac","xyz-0vc"],'1':['axc-0aa',"abd-xyz","abt-Rac","xyz-1avc"],
                '3':['abc-aaa',"NaN","abt-9ac","xyz-9vc"]})

我有这个数据框,我想检查每一行和每一列的特定值。例如索引0 有4个值“qwa abc”、“abd xyz”、“abt Rac”、“xyz-0avc”

对于每个值,我要检查xxx-是否有任何数字

例如:

qua abc在第4位有a,所以什么都不要做。当到达xyz-0ac时,位置4处有数字0。因此,它应该运行user define函数,以将整个值(xyz-0vc)替换为user define函数得到的任何值

注意:我尝试运行str.replace,但它只支持特定的用户定义字符串。在这里,用户函数将连接到不同的系统并获得一个字符串。因此它不是预先定义的


Tags: 函数字符串用户df定义数字pdabc
3条回答

这个答案基于@NomadMonad

string_replacer()是一个函数,它将根据满足条件的输入值更改值

def replace_value(row, value): for cell in row: try: if pd.notna(cell) and cell[4].isnumeric(): value=string_replacer(cell) yield value else: yield cell except: print(row,value) if_df.apply(lambda x: pd.Series(replace_value(x,value)), axis=1)

如果要更改数据帧中的所有单元格,需要在行轴上使用pd.apply,因此自定义函数需要将pd.Series作为参数之一。在本例中,行是系列

此生成器函数迭代行中的每个单元格,检查索引4处的字符是否为数字。如果为true,则返回要替换字符串的值,否则将返回单元格本身的值

def replace_value(row, value):
    for cell in row:
        if pd.notna(cell) and cell[4].isnumeric():
            yield value
        else:
            yield cell

df.apply(lambda x: pd.Series(replace_value(x, 'myvalue')), axis=1)

然后按行应用自定义函数(axis=1),并将其包装在lambda中,这样就可以传递额外的参数(value,在本例中),然后对函数返回的iterator调用pd.Series

希望它有意义

您不需要单独的方法,请尝试以下方法:

In [1200]: df.loc[df['0'].str[4].str.isdigit(), '0'] = 'myvalue'                                                                                                                                            

In [1201]: df                                                                                                                                                                                               
Out[1201]: 
         0         1        3
0  qwa-abc   axc-0aa  abc-aaa
1  abd-xyz   abd-xyz      NaN
2  abt-Rac   abt-Rac  abt-9ac
3  myvalue  xyz-1avc  xyz-9vc

要在所有列中执行此操作,请执行以下操作:

In [1242]: def check_digit(cols,new_val): 
      ...:     for i in cols: 
      ...:         df.loc[(df[i].str[4].str.isdigit()) & (df[i].notna()), i] = new_val 
      ...:  

In [1243]: df.apply(lambda x: check_digit(df.columns, 'myval'), 1)

In [1244]: df                                                                                                                                                                                               
Out[1244]: 
         0        1        3
0  qwa-abc    myval  abc-aaa
1  abd-xyz  abd-xyz      NaN
2  abt-Rac  abt-Rac    myval
3    myval    myval    myval

相关问题 更多 >