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

时间:2020-04-17 09:54:31

标签: python pandas dataframe

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"]})

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

对于每个要检查的值xxx- 任何数字 xx。

示例:

qua-abc在第4位有 a ,因此什么也不做。当到达xyz- 0 ac时,位置4处为数字0。因此,它应运行用户定义函数以将整个值(xyz-0vc)替换为用户定义函数获得的值。

注意:我尝试运行str.replace,但它仅支持特定的用户定义字符串。在此,用户功能将连接到其他系统并获取字符串。因此它不是预定义

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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),然后调用pd.Series函数返回的iterator

希望有道理。

答案 2 :(得分:0)

此答案基于@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)