проверьте каждую строку и столбец в кадре данных и замените значение пользовательской функцией - PullRequest
1 голос
/ 17 апреля 2020
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, я хочу проверить каждую строку и каждый столбец для определенного значения c. например, в индексе 0 есть 4 значения: «qwa-ab c», «abd-xyz», «abt-Ra c», «xyz-0av c».

для каждого значения, которое я хочу проверить, если xxx- любое число xx.

пример:

qua-ab c имеет a в позиции 4, поэтому ничего не делайте. когда он достигает xyz- 0 a c, в позиции 4 появляется число 0, следовательно, он должен запустить функцию определения пользователя, чтобы заменить целое значение (xyz-0v c) на любое значение, определяемое пользователем. get.

ПРИМЕЧАНИЕ. Я попытался запустить str.replace, но он поддерживает только указанную c определяемую пользователем строку. здесь пользовательская функция подключится к другой системе и получит строку. следовательно, это не предопределено .

Ответы [ 3 ]

1 голос
/ 17 апреля 2020

Если вы хотите изменить все ячейки в вашем Dataframe, вам нужно использовать pd.apply по оси строк, поэтому ваша пользовательская функция должна принять pd.Series в качестве одного из параметров. В этом примере строка является серией.

Эта функция генератора выполняет итерации по каждой ячейке в строке, проверяя, является ли символ в индексе 4 цифрой c. Если 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) и заключаете ее в лямбду так что вы можете передать дополнительные аргументы (в данном случае value) и затем вызвать pd.Series для iterator, возвращаемого функцией.

Надеюсь, это имеет смысл.

1 голос
/ 17 апреля 2020

Вам не нужен отдельный метод, попробуйте это:

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
0 голосов
/ 18 апреля 2020

Этот ответ основан на @ 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...