2017-10-04 99 views
1

我有一個數據框中的列的列表,我想要通過它們並對其執行操作。該列保存日期時間或沒有。嘗試迭代日期時間列的列表

對於列表中的每一列,我想將其中包含「20」的列中的每個值修剪爲前10個字符,否則將其保留原樣。

我試過這幾種方式,但得到各種錯誤或不完美的結果。

以下版本拋出錯誤「'str'對象沒有屬性'apply'」,但是如果我不使用「.astype(str)」,那麼我得到一個錯誤「type of argument」 datetime.datetime'不可迭代「。

df_combined[dateColumns] = df_combined[dateColumns].fillna(notFoundText).astype(str) 
    print (dateColumns) 
    for column in dateColumns: 
     for row in range(len(column)): 
      print(df_combined[column][row]) 
      if "20" in (df_combined[column][row]): 
       df_combined[column][row].apply(lambda x: x[:10], axis=1) 
      print(df_combined[column][row]) 

Halp。提前致謝。

回答

3

循環被認爲是大熊貓的憎惡。我建議只是做這樣的事情,str.contains + np.where

for c in df.columns: 
    # df[c] = df[c].astype(str) # uncomment this if your columns aren't dtype=str 
    df[c] = np.where(df[c].str.contains("20"), df[c].str[:10], df[c]) 
3

IIUC:

你想這樣做,在整個數據幀。
如果是這樣,這裏是在整個數據幀中一次使用numpy的矢量化方式。

設置

df = pd.DataFrame([ 
    ['xxxxxxxx20yyyy', 'z' * 14, 'wwwwwwww20vvvv'], 
    ['k' * 14, 'dddddddd20ffff', 'a' * 14] 
], columns=list('ABC')) 

df 

       A    B    C 
0 xxxxxxxx20yyyy zzzzzzzzzzzzzz wwwwwwww20vvvv 
1 kkkkkkkkkkkkkk dddddddd20ffff aaaaaaaaaaaaaa 

解決方案
使用numpy.core.defchararray.findnp.where

from numpy.core.defchararray import find 

v = df.values.astype(str) 
i, j = np.where(find(v, '20') > -1) 

v[i, j] = v[i, j].astype('<U10') 

df.loc[:] = v 

df 

       A    B    C 
0  xxxxxxxx20 zzzzzzzzzzzzzz  wwwwwwww20 
1 kkkkkkkkkkkkkk  dddddddd20 aaaaaaaaaaaaaa 

如果你不想覆蓋舊數據框,您可以創建一個新的一個:

pd.DataFrame(v, df.index, df.columns) 

       A    B    C 
0  xxxxxxxx20 zzzzzzzzzzzzzz  wwwwwwww20 
1 kkkkkkkkkkkkkk  dddddddd20 aaaaaaaaaaaaaa