2

データフレームとリストがあります。列の文字列がリスト内の何かで終わっているかどうかを確認したい。列がリスト内の何かで終わるかどうかを示す新しい列を作成したいのですが、値は「Y」、それ以外は「N」です。私のデータフレーム データは次のようになります。

import pandas as pd
city = ['New York', 'Los Angeles','Buffalo','Miami','San Deigo', 'San 
Francisco']
population = ['8.5','3.9','0.25','0.45','1.4','0.87']
df = pd.DataFrame({'city':city,'population':population})

ending = ['les','sco', 'igo']

期待される結果は次のようになります。

city          population    flag
New York       8.5          N
Los Angeles    3.9          Y
Buffalo        0.25         N
Miami          0.45         N
San Deigo      1.4          Y
San Francisco  0.87         Y

if ステートメントを使用しようとしました:

if df['city'].str.endswith(tuple(ending)):
   val = 'Y'
elif df['city'].str.endswith(tuple(ending)):
    val= 'Y'
else:
   val = 'N'

エラーメッセージが表示されます:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

なにか提案を?感謝!

4

4 に答える 4

1

末尾が常に 3 文字の文字列であると仮定すると、次のように使用できます。

df['flag']=df['city'].map(lambda x: x[-3:] in ending) 

生産する

            city population   flag
0       New York        8.5  False
1    Los Angeles        3.9   True
2        Buffalo       0.25  False
3          Miami       0.45  False
4      San Deigo        1.4   True
5  San Francisco       0.87   True

バイナリの結果を True/False ではなく Y/N にする必要がある場合は、別のマップを実行できます。

def bin(arg):
    if arg==True:
        return 'Y'
    return 'F'

df.flag=df.flag.map(lambda x: bin(x))

その結果、

            city population flag
0       New York        8.5    F
1    Los Angeles        3.9    Y
2        Buffalo       0.25    F
3          Miami       0.45    F
4      San Deigo        1.4    Y
5  San Francisco       0.87    Y
于 2018-06-22T22:00:57.813 に答える