根据数据行中是否包含所有回文,在数据框中使用值'bingo'或'nop'创建新列

问题描述 投票:0回答:1

(对不起,必须删除我以前的帖子才能解决问题。)

我最近在一次采访中为这个问题而苦苦挣扎,没有时间(在此之前我还有其他问题要解决)。我回过头来解决了这个问题,但是我只是想知道其他人如何解决这个问题。我仍然是编程的初学者,所以我的回答很可能不是最好的。

我得到了以下代码:

import pandas as pd

input_df = pd.DataFrame(
    [
        'Noon,Feature,Good'.split(','),
        'Radar,Refer,Wow'.split(','),
        'Other,Day,Mouse'.split(',')
    ],
    columns='String_1,String_2,String_3'.split(',')
)

output_df = pd.DataFrame(
    [
        [1,0,0,'nop'],
        [1,1,1,'bingo'],
        [0,0,0,'nop']
    ],
    columns='String_1,String_2,String_3,Bingo'.split(',')
)

因此,考虑到input_df,编写一个名为bingo的函数,它将产生给定的output_df。

这是我想出的:

def is_palindrome(s):
    s = s.lower()

    new_s = ""

    for char in s:
        if char.isalnum():
            new_s += char

    if new_s == new_s[::-1]:
        return 1
    else:
        return 0


def bingo(df):
    df = df.applymap(is_palindrome)

    num_col = len(df.columns)

    sums = df.apply(sum, axis=1)

    values = []
    for item in sums:
        if item == num_col:
            values.append('bingo')
        else:
            values.append('nop')

    df['Bingo'] = values

    return df

output_df.equals(bingo(input_df))返回True,所以我相信在这种情况下我已经解决了问题。感谢您提供任何建议,不妨看看其他人如何更有效地解决此问题。

python string pandas dataframe palindrome
1个回答
0
投票

您可以使用applymap来比较每个单元格及其反词,然后使用np.where来确定它是宾果游戏还是nop。

output_df = (
    input_df.applymap(lambda x: int(x[::-1].lower()==x.lower()))
    .assign(Bingo=lambda x: np.where(x.all(1), 'bingo', 'nop'))
)

    String_1    String_2    String_3    Bingo
0   1           0           0           nop
1   1           1           1           bingo
2   0           0           0           nop
© www.soinside.com 2019 - 2024. All rights reserved.