2017-07-06 58 views
1

Exp的索引匹配的值是一個DataFramedatetimeobject循環通過一個大熊貓柱與另一個數據幀

  Exp 
0 1989-06-01 
1 1989-07-01 
2 1989-08-01 
3 1989-09-01 
4 1989-10-01 

CLDataframeIndexDateTime Object

    CL 
1989-06-01 68.800026 
1989-06-04 68.620026 
1989-06-05 68.930023 
1989-06-06 68.990021 
1989-06-09 69.110023 
  • 欲在0123中添加新列數據幀,其中將具有與CL索引匹配的Exp的日期。

這是我想要的輸出應該是什麼樣子

    CL   R 

1989-06-01 68.800026 1989-06-01 
1989-06-04 68.620026 
1989-06-05 68.930023 
1989-06-06 68.990021 
1989-06-09 69.110023 

這就是我想這樣做:

for m in Exp.iloc[:,0]: 
if m == CL.index: 
    CL['R'] = m 

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

有人可以幫我嗎?我不斷收到此ValueError很多次

+0

的錯誤是因爲你比較標'M'到一個數組'CL.index'其中有許多價值。在你的解釋器中測試這個語句 - 它將返回的將是一個與索引一樣長的布爾值數組。錯誤是告訴你,你需要評估數組作爲單個值;所以如果數組中的所有值都必須爲true,那麼如果數組中的一個「True」應該爲真,則使用'any()'。 – cmaher

+0

除了這個錯誤之外,賦值'CL ['Exp'] = m'將覆蓋它產生的每個匹配的任何現有的'CL ['Exp']'值,因爲你正在給一個標量'm'賦值列'Exp'。你正在尋找的結果可以被認爲是一個SQL左連接 - 在pandas.DataFrame.merge或pandas.DataFrame.join上進行閱讀,以瞭解如何在熊貓中執行左連接類操作。 – cmaher

+0

我想選擇一個m的值並在CL.Index數組中搜索,如果它存在的話。如果是這樣,我想將該日期的一行添加到同一日期的R的新列中。 – Wolverine

回答

2

編輯:更新與評論者的建議。

你需要做的LEFT JOIN:

Exp = pd.DataFrame(
    pd.to_datetime(['1989-06-01', '1989-07-01', '1989-08-01', '1989-09-01', '1989-10-01']), 
    columns=['Exp']) 

給出:

  Exp 
0 1989-06-01 
1 1989-07-01 
2 1989-08-01 
3 1989-09-01 
4 1989-10-01 

CL = pd.DataFrame(
[68.800026, 68.620026, 68.930023, 68.990021, 69.110023], 
index = pd.to_datetime(['1989-06-01', '1989-06-04', '1989-06-05', '1989-06-06', '1989-06-09']), 
columns = ['CL']) 

    CL 
1989-06-01 68.800026 
1989-06-04 68.620026 
1989-06-05 68.930023 
1989-06-06 68.990021 
1989-06-09 69.110023 

則:

(CL 
.reset_index() 
.merge(Exp, how='left', right_on='Exp', left_on='index') 
.set_index('index') 
.rename(columns={'Exp': 'R'})) 

返回你在找什麼

    CL   R 
index        
1989-06-01 68.800026 1989-06-01 
1989-06-04 68.620026   NaN 
1989-06-05 68.930023   NaN 
1989-06-06 68.990021   NaN 
1989-06-09 69.110023   NaN 

因爲遍歷數據幀不做事的方式大熊貓。

+1

'R'具有'NaN',因爲您沒有將列/索引設置爲'Timestamps' ....除此之外,看起來不錯!加一。 – piRSquared

+0

太神奇了!它的工作非常感謝。你的觀點還記得 – Wolverine

+0

@piRSquared,根據你的建議更新!我一定忽略了這些是'日期時間'欄。 – mkos

0

pd.DataFrame.join
join着重於通過索引dataframes /系列組合。
使用​​Expdrop=False保持相同的信息在數據幀本身和索引。我們把它放在索引中以使join方便。

CL.join(Exp.set_index('Exp', drop=False)).rename(columns=dict(Exp='R')) 

        CL   R 
1989-06-01 68.800026 1989-06-01 
1989-06-04 68.620026  NaT 
1989-06-05 68.930023  NaT 
1989-06-06 68.990021  NaT 
1989-06-09 69.110023  NaT 

設置

Exp = pd.DataFrame(dict(
     Exp=pd.to_datetime(
      ['1989-06-01', '1989-07-01', '1989-08-01', '1989-09-01', '1989-10-01']) 
    )) 

CL = pd.DataFrame(dict(
     CL=[68.800026, 68.620026, 68.930023, 68.990021, 69.110023], 
    ), pd.to_datetime(
     ['1989-06-01', '1989-06-04', '1989-06-05', '1989-06-06', '1989-06-09'])) 
+0

感謝它的工作! – Wolverine