在 pandas DataFrame 中,我想完成兩個清理步驟:
- 洗掉任何有缺失值的行;和
- 將日期列從
DD.MM.YYYY模式轉換為標準YYYY-MM-DD
我確實分別知道每個步驟的答案:
- 洗掉缺失值可以通過
pandas.dropna() - 將
DD.MM.YYYY字串轉換為YYYY-MM-DD可以完成pandas.to_datetime(x, format='%d.%m.%Y')
但是,我不確定連續處理這兩個步驟的“標準”方式是什么(又名“鏈接程式”)。
我已經看到了這個非常切合主題的答案,但太簡陋了。
例子
import numpy as np
import pandas as pd
name = ['John', 'Melinda', 'Greg', 'Amanda']
dob = ['20.12.2001', '11.03.1991', '31.12.1999', np.nan]
my_df = pd.DataFrame({'name':name,'dob':dob})
my_df
#> name dob
#> 0 John 20.12.2001
#> 1 Melinda 11.03.1991
#> 2 Greg 31.12.1999
#> 3 Amanda NaN
我正在嘗試撰寫一個簡潔的代碼,類似于:
# pseudo code
my_df.dropna().to_datetime('dob', format='%d.%m.%Y')
# expected output
#> name dob
#> 0 John 2001-12-20
#> 1 Melinda 1991-03-11
#> 2 Greg 1999-12-31
但我不能讓它變得那么簡單!無論如何,似乎我必須首先將 no-NaN 資料幀分配給另一個變數。那是:
my_df_nona = my_df.dropna()
然后使用to_datetime().
其次,我不確定我應該如何my_df_nona分配給. 我應該使用copy()嗎?
以下是同一程序的三個版本。每個都提供所需的輸出,但警告的組合不同。
選項1
- 不使用
.copy() - 按照此處
.loc([:, 'dob'])的建議使用 -
my_df_nona_1 = my_df.dropna() my_df_nona_1.loc[:, 'dob'] = pd.to_datetime(my_df_nona_1.loc[:, 'dob'], format='%d.%m.%Y') #> SettingWithCopyWarning: #> A value is trying to be set on a copy of a slice from a DataFrame. #> Try using .loc[row_indexer,col_indexer] = value instead #> See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy #> FutureWarning: In a future version, `df.iloc[:, i] = newvals` will attempt to set the values inplace instead of always setting a new array. To retain the old behavior, use either `df[df.columns[i]] = newvals` or, if columns are non-unique, `df.isetitem(i, newvals)`
選項 2
- 使用
.copy() - 使用
.loc([:, 'dob']) -
my_df_nona_2 = my_df.dropna().copy() my_df_nona_2.loc[:, 'dob'] = pd.to_datetime(my_df_nona_2.loc[:, 'dob'], format='%d.%m.%Y') #> FutureWarning: In a future version, `df.iloc[:, i] = newvals` will attempt to set the values inplace instead of always setting a new array. To retain the old behavior, use either `df[df.columns[i]] = newvals` or, if columns are non-unique, `df.isetitem(i, newvals)`
選項 3
- 使用
.copy() - 不使用
.loc([:, 'dob']) -
my_df_nona_3 = my_df.dropna().copy() my_df_nona_3['dob'] = pd.to_datetime(my_df_nona_3['dob'], format='%d.%m.%Y')
概括
作為大熊貓的初學者,我想問一下:
有沒有辦法以功能方式鏈接這些程式?
我來自可以做的 R# R my_df |> drop_na() |> mutate(across(dob, dmy))我試圖了解我是否應該嘗試在熊貓中模仿這種語法
如果 (1) 的答案是“否”,那么對于洗掉缺失值、然后轉換
dob列型別、然后可能在資料框上進行額外資料整理/聚合的作業流,最佳實踐是什么?
我看過這個關于SettingWithCopyWarning. 這是有見地的。但是,我不確定我的看法是否應該是 using.copy()是解決所有資料幀分配問題的靈丹妙藥。我能想到的一個限制是,到處使用.copy()會使記憶體膨脹。
uj5u.com熱心網友回復:
用于DataFrame.assign鏈:to_datetime_DataFrame.dropna
df = my_df.dropna().assign(dob = lambda x: pd.to_datetime(x['dob'], format='%d.%m.%Y'))
print (df)
name dob
0 John 2001-12-20
1 Melinda 1991-03-11
2 Greg 1999-12-31
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/534940.html
上一篇:如何制作閃爍著色器?
下一篇:如何在資料幀的子集上添加時間增量
