2017-10-06 11 views
1

データフレームの行のすべての列でテキスト「Total」を検索しようとしています。Pandas DataFrameは、最初の列を返すだけを適用します。

def f(row): 
    for i in range(0,len(row)) 
     if re.search('Total', row[i]) is None: 
      return False 
     else: 
      return True 

data['newColumn'] = data.apply(f, axis=1) 

関数fがデータフレームの1行につき1回呼び出されると仮定するのは正しいですか?

len(row)が実際に正しい量の列を返しても、newColumnはデータフレーム内の最初の列からの合計だけを取得します。

印刷(行[i])を追加すると、正しい値が印刷されます。しかし、新しい列への代入は、Totalが最初の列のテキストにある場合にのみTrueです。私はまた、関数に渡された行を繰り返すことができないようです。それはシリーズタイプです。

答えて

1

ループ内で両方のケースについてreturn文があるので、関数は常に最初のカラムの後に戻ります。

代わりにこれを試してみてください:

import pandas as pd 
df = pd.DataFrame({"row_1": ["foo", "Total", "bar"], 
        "row_2": ["Total", "foo", "bar"]}) 
df["is_total_in_row"] = df.apply(
    lambda row : "Total" in list(row), axis=1) 
print(df) 

戻り

 row_1 row_2 is_total_in_row 
0 foo Total    True 
1 Total foo    True 
2 bar bar   False 
1
@Sumidoから設定

借用サンプルデータ:

In [43]: df['newColumn'] = df.select_dtypes(['object']).sum(1).str.contains('Total') 

In [44]: df 
Out[44]: 
    row_1 row_2 newColumn 
0 foo Total  True 
1 Total foo  True 
2 bar bar  False 

説明:

In [50]: df.select_dtypes(['object']).sum(1) 
Out[50]: 
0 fooTotal 
1 Totalfoo 
2  barbar 
dtype: object 
関連する問題