2017-08-03 80 views
0

我有一個df看起來像下面,但更大。在lastDate的列下有一些不正確的日期,並且它們只有在correctDate列中存在某些內容時纔是不正確的。使用for循環熊貓代替日期時間值

dff = pd.DataFrame(
      {"lastDate":['2016-3-27', '2016-4-11', '2016-3-27', '2016-3-27', '2016-5-25', '2016-5-31'], 
      "fixedDate":['2016-1-3', '', '2016-1-18', '2016-4-5', '2016-2-27', ''], 
      "analyst":['John Doe', 'Brad', 'John', 'Frank', 'Claud', 'John Doe'] 
      }) 

enter image description here

enter image description here 第一個是我,第二個是想我有循環後

回答

1

首先將這些列的datetime dtypes:

for col in ['fixedDate', 'lastDate']: 
    df[col] = pd.to_datetime(df[col]) 

然後您可以使用

mask = pd.notnull(df['fixedDate']) 
df.loc[mask, 'lastDate'] = df['fixedDate'] 

例如,

import pandas as pd 

df = pd.DataFrame({"lastDate":['2016-3-27', '2016-4-11', '2016-3-27', '2016-3-27', '2016-5-25', '2016-5-31'], "fixedDate":['2016-1-3', '', '2016-1-18', '2016-4-5', '2016-2-27', ''], "analyst":['John Doe', 'Brad', 'John', 'Frank', 'Claud', 'John Doe'] }) 

for col in ['fixedDate', 'lastDate']: 
    df[col] = pd.to_datetime(df[col]) 

mask = pd.notnull(df['fixedDate']) 
df.loc[mask, 'lastDate'] = df['fixedDate'] 
print(df) 

產生

analyst fixedDate lastDate 
0 John Doe 2016-01-03 2016-01-03 
1  Brad  NaT 2016-04-11 
2  John 2016-01-18 2016-01-18 
3  Frank 2016-04-05 2016-04-05 
4  Claud 2016-02-27 2016-02-27 
5 John Doe  NaT 2016-05-31 
+0

當我申請面膜我的真實數據集,這讓所有的lastDate與空fixedDate爲空爲好。這並沒有發生在樣本df上。任何線索爲什麼會發生這種情況? – Johnny

+0

我寫過將日期字符串轉換爲實際日期並不是絕對必要的,但現在我意識到這是不正確的。 'pd.notnull([''])'等於'np.array([True])'所以'mask'將會是True,其中'fixedDate'是一個空字符串。即使'fixedDate'是一個空字符串,這會導致'df.loc [mask,'lastDate'] = df ['fixedDate']'覆蓋'lastDate'。這可能會解釋你看到的行爲,假設你沒有使用'pd.to_datetime'將日期字符串轉換爲'datetime64's。 – unutbu