簡體   English   中英

檢查 dataframe 中的每一行和每一列,並用用戶定義的 function 替換值

[英]check each row and column in dataframe and replace value with user define function

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 在 position 4 上有一個,所以什么也不做。 當它到達 xyz- 0 ac 時,在 position 4 處有數字 0。因此它應該運行用戶定義 function 以將整個值(xyz-0vc)替換為用戶定義的任何值 ZC1C425268E683895D1AB45

注意:我嘗試運行 str.replace 但它只支持特定的用戶定義字符串。 這里用戶 function 將連接到不同的系統並獲得一個字符串。 因此它不是預定義的。

如果要更改 Dataframe 中的所有單元格,則需要在行軸上使用pd.apply ,因此您的自定義 function 需要將pd.Series作為參數之一。 在此示例中,行是系列。

此生成器 function 迭代行中的每個單元格,檢查索引 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)

You then apply your custom function row wise, ( axis=1 ) and wrap it in a lambda so you can pass additional arguments ( value in this case) and then call pd.Series on the iterator returned by the function.

希望這是有道理的。

您不需要單獨的方法,試試這個:

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

這個答案基於@NomadMonad

string_replacer() 是一個 function 將根據滿足條件的輸入值更改值

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM