使用值 'bingo' 或 'nop' 在数据框中创建一个新列,具体取决于该行是否包含所有回文

Create a new column in a dataframe with the values 'bingo' or 'nop' depending on if the row contains all palindromes or not

(抱歉,不得不删除我之前的 post 来修复一些东西。)

我最近在一次面试中遇到了这个问题,运行 没时间(在此之前我还有其他问题要解决)。后来我回去解决了它,但我只是想知道其他人会如何解决这个问题。我在编程方面还是有点初学者,所以我的回答很可能不是最好的。

我得到了以下代码:

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)) returns 是的所以我相信我已经解决了这个问题。感谢您的任何建议,很想看看其他人如何更有效地解决这个问题。

您可以使用 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