Python Dataframe: удалить цифры в нечетной и четной позиции из строк df? - PullRequest
0 голосов
/ 27 мая 2020

У меня есть df с двумя столбцами number, type. Я пытаюсь удалить числа в нечетной позиции, если type равно change и условие равно odd.

И аналогично числа в четной позиции, если type равно change и условие even.

Для номера - (7,14,21,28) без цифр в odd позиции - 7,21.

Аналогично - (3,6,5,8) без цифр в even позиции - 6,8

df

    df= pd.DataFrame(data = {'number' : ['7,14,21,28', '2,5', '3,6,5,8 ', '4', '3,10,17,24,31'], 'type' : ['change', 'dont_change', 'change', 'dont_change', 'change'], 'condition':['odd','even','even','odd','odd']}) 


    number          type             condition
0   7,14,21,28      change             odd
1   2,5             dont_change        even
2   3,6,5,8         change             even 
3   4               dont_change        odd
4   3,10,17,24,31   change             odd

Мой исключенный вывод:

    number          type             condition
0   7,21            change             odd
1   2,5             dont_change        even
2   6,8             change             even 
3   4               dont_change        odd
4   3,17,31         change             odd

То, что я пробовал:

У меня есть два разных кода для четного и нечетного. Without adding type - condition - change/dont_change

string slicing with step = 2


even

df.number = np.where(df['condition'].eq('odd'), df.number.str.split(',').str[1::2].str.join(','), df['number'])


odd

df.number = np.where(df['condition'].eq('odd'), df.number.str.split(',').str[::2].str.join(','), df['number'])

Как мне исходить из этого?

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

Попробуем np.select

cond1=df['condition'].eq('odd') & df.type.eq('change')
cond2=df['condition'].eq('even') & df.type.eq('change')
v1=df.number.str.split(',').str[::2].str.join(',')
v2=df.number.str.split(',').str[1::2].str.join(',')
df.number=np.select([cond1,cond2], [v1,v2], default = df.number)
df
Out[417]: 
    number         type condition
0     7,21       change       odd
1      2,5  dont_change      even
2     6,8        change      even
3        4  dont_change       odd
4  3,17,31       change       odd
1 голос
/ 27 мая 2020

Не могли бы вы попробовать это?

def filter_numbers(row):
    if row['type'] == 'change':
        if row['condition'] == 'odd':
            return ','.join(row['number'].split(',')[::2])
        else:
            return ','.join(row['number'].split(',')[1::2])
    return row['number']

df['number'] = df.apply(filter_numbers, axis=1)

print(df)

Вывод:

    number         type condition
0     7,21       change       odd
1      2,5  dont_change      even
2     6,8        change      even
3        4  dont_change       odd
4  3,17,31       change       odd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...