2017-04-20 2 views
1

내가 같은 두 팬더의 dataframes이 사용 팬더의 열 값을 대체합니다시계열 지수

import pandas as pd  
index = pd.date_range('06/01/2014',periods=48,freq='H') 
df1 = pd.DataFrame(range(len(index)),index=index) 

index2 = pd.date_range('06/02/2014',periods=24,freq='H') 
df2 = pd.DataFrame(range(0,24),index=index2) 

가 어떻게 시계열 인덱스를 사용하여 df2의 값 df1의 값을 대체 할 수 있습니까?

df1 = df2.combine_first(df1) 

하지만 그렇지 않은 경우가 있습니다 : 나는 항상 df2.indexdf1.index에있는 경우 combine_first 필요하다고 생각이 데이터 프레임의 인덱스, df1의 값이 df2

답변

1

의 값으로 대체 취득해야한다 일치하는 whereever 의미 약간 복잡 - intersection을 추가 한 다음 사용 combine_first :

index = pd.date_range('06/01/2014',periods=12,freq='H') 
df1 = pd.DataFrame(np.arange(len(index)),index=index) 

index2 = pd.date_range('06/01/2014 08:00:00',periods=6,freq='H') 
df2 = pd.DataFrame(np.arange(0,6),index=index2) 
print (df1) 
         0 
2014-06-01 00:00:00 0 
2014-06-01 01:00:00 1 
2014-06-01 02:00:00 2 
2014-06-01 03:00:00 3 
2014-06-01 04:00:00 4 
2014-06-01 05:00:00 5 
2014-06-01 06:00:00 6 
2014-06-01 07:00:00 7 
2014-06-01 08:00:00 8 
2014-06-01 09:00:00 9 
2014-06-01 10:00:00 10 
2014-06-01 11:00:00 11 

print (df2) 

        0 
2014-06-01 08:00:00 0 
2014-06-01 09:00:00 1 
2014-06-01 10:00:00 2 
2014-06-01 11:00:00 3 
2014-06-01 12:00:00 4 
2014-06-01 13:00:00 5 
df1 = df2.loc[df2.index.intersection(df1.index)].combine_first(df1) 
print (df1) 
         0 
2014-06-01 00:00:00 0.0 
2014-06-01 01:00:00 1.0 
2014-06-01 02:00:00 2.0 
2014-06-01 03:00:00 3.0 
2014-06-01 04:00:00 4.0 
2014-06-01 05:00:00 5.0 
2014-06-01 06:00:00 6.0 
2014-06-01 07:00:00 7.0 
2014-06-01 08:00:00 0.0 
2014-06-01 09:00:00 1.0 
2014-06-01 10:00:00 2.0 
2014-06-01 11:00:00 3.0 
,

loc 또 다른 솔루션 :

df1.loc[df2.index.intersection(df1.index)] = df2 
print (df1) 
        0 
2014-06-01 00:00:00 0 
2014-06-01 01:00:00 1 
2014-06-01 02:00:00 2 
2014-06-01 03:00:00 3 
2014-06-01 04:00:00 4 
2014-06-01 05:00:00 5 
2014-06-01 06:00:00 6 
2014-06-01 07:00:00 7 
2014-06-01 08:00:00 0 
2014-06-01 09:00:00 1 
2014-06-01 10:00:00 2 
2014-06-01 11:00:00 3 
1

참고 : 우리는 combine_first를 사용할 수 있지만, 난 당신이 포함해야 combine_first를 사용하려면 ... floatdtypes 변환 좋아하지 않는다 reindex 또는 reindex_like

df2.combine_first(df1).reindex_like(df1) 

또는

df2.combine_first(df1).reindex(df1.index) 

우리는 사전에 lambdamap을 사용할 수 있습니다

내 선호하는 솔루션. 이것으로 정수 dtype을 사전 get 키를 사용하여 보존 할 수 있습니다.이 방법은 키가 존재하지 않을 때 기본값을 사용합니다.

m = df2[0].to_dict() 
f = lambda x: m.get(x, df1.at[x, 0]) 
df1.index.to_series().map(f) 
# you can assign this back to `df1` with 
# df1[0] = df1.index.to_series().map(f) 

2014-06-01 00:00:00  0 
2014-06-01 01:00:00  1 
2014-06-01 02:00:00  2 
2014-06-01 03:00:00  3 
2014-06-01 04:00:00  4 
2014-06-01 05:00:00  5 
2014-06-01 06:00:00  6 
2014-06-01 07:00:00  7 
2014-06-01 08:00:00  8 
2014-06-01 09:00:00  9 
2014-06-01 10:00:00 10 
2014-06-01 11:00:00 11 
2014-06-01 12:00:00 12 
2014-06-01 13:00:00 13 
2014-06-01 14:00:00 14 
2014-06-01 15:00:00 15 
2014-06-01 16:00:00 16 
2014-06-01 17:00:00 17 
2014-06-01 18:00:00 18 
2014-06-01 19:00:00 19 
2014-06-01 20:00:00 20 
2014-06-01 21:00:00 21 
2014-06-01 22:00:00 22 
2014-06-01 23:00:00 23 
2014-06-02 00:00:00  0 
2014-06-02 01:00:00  1 
2014-06-02 02:00:00  2 
2014-06-02 03:00:00  3 
2014-06-02 04:00:00  4 
2014-06-02 05:00:00  5 
2014-06-02 06:00:00  6 
2014-06-02 07:00:00  7 
2014-06-02 08:00:00  8 
2014-06-02 09:00:00  9 
2014-06-02 10:00:00 10 
2014-06-02 11:00:00 11 
2014-06-02 12:00:00 12 
2014-06-02 13:00:00 13 
2014-06-02 14:00:00 14 
2014-06-02 15:00:00 15 
2014-06-02 16:00:00 16 
2014-06-02 17:00:00 17 
2014-06-02 18:00:00 18 
2014-06-02 19:00:00 19 
2014-06-02 20:00:00 20 
2014-06-02 21:00:00 21 
2014-06-02 22:00:00 22 
2014-06-02 23:00:00 23 
Freq: H, dtype: int64