web-dev-qa-db-ja.com

pandasデータフレームの列にmap()を使用する

データフレームにいくつかの列があり、日付の部分を保持し、時間の部分を削除するだけです。これらの列のリストを作成しました。

list_of_cols_to_change = ['col1','col2','col3','col4']

これを行うための関数を作成しました。列のリストを受け取り、リスト内の各列にdt.dateを適用します。

def datefunc(x):
    for column in x:
        df[column] = df[column].dt.date

次に、リストをパラメーターとして渡してこの関数を呼び出します。

datefunc(list_of_cols_to_change )

Map()のようなものを使用してこれを達成したいと思います。基本的に、列をパラメーターとして受け取り、それに変更を加える関数を使用します。次に、map()を使用して、この関数を使用している列のリストに適用します。このようなもの:

def datefunc_new(column):
    df[column] = df[column].dt.date

map(datefunc_new,list_of_cols_to_change)

ただし、これは機能しません。どうすればこの作品を作ることができますか?

12

最も簡単なのは、lambda関数と apply を使用することです。

df = pd.DataFrame({'col1':pd.date_range('2015-01-02 15:00:07', periods=3),
                   'col2':pd.date_range('2015-05-02 15:00:07', periods=3),
                   'col3':pd.date_range('2015-04-02 15:00:07', periods=3),
                   'col4':pd.date_range('2015-09-02 15:00:07', periods=3),
                   'col5':[5,3,6],
                   'col6':[7,4,3]})

print (df)
                 col1                col2                col3  \
0 2015-01-02 15:00:07 2015-05-02 15:00:07 2015-04-02 15:00:07   
1 2015-01-03 15:00:07 2015-05-03 15:00:07 2015-04-03 15:00:07   
2 2015-01-04 15:00:07 2015-05-04 15:00:07 2015-04-04 15:00:07   

                 col4  col5  col6  
0 2015-09-02 15:00:07     5     7  
1 2015-09-03 15:00:07     3     4  
2 2015-09-04 15:00:07     6     3  

list_of_cols_to_change = ['col1','col2','col3','col4']
df[list_of_cols_to_change] = df[list_of_cols_to_change].apply(lambda x: x.dt.date)
print (df)
         col1        col2        col3        col4  col5  col6
0  2015-01-02  2015-05-02  2015-04-02  2015-09-02     5     7
1  2015-01-03  2015-05-03  2015-04-03  2015-09-03     3     4
2  2015-01-04  2015-05-04  2015-04-04  2015-09-04     6     3
14
jezrael

私はあなたがすでに解決策を持っていると思う、あなたのdatefunc_new関数にパラメータとしてcolumnを追加するだけ:

def datefunc_new(column):
    df[column] = df[column].dt.date

map(datefunc_new, list_of_cols_to_change)

あなたの特定の例のために、より多くのpandasのようなコードを使用することもできます:

def to_date(series):
    return series.dt.date

df[list_of_cols_to_change] = df[list_of_cols_to_change].apply(to_date)
3
pansen