2017-10-21 5 views
1

안녕하세요.이 DF에 도착했습니다. 여기에 흥미로운 칼럼을 보여주고 있습니다. 행과 열 모두에서 더 커집니다 (DF.shape = (185, 34)). 다른 DF의 정보로 판다 DF 셀을 채우기

enter image description here

당신이 볼 수 있듯이

outSpeed 필드는 지연과 같은 포트 비어 있습니다. 다음 생산

내가 LAG에 대한 outSpeed와 다른 DF를 계산 한

...

dfLags = df[df['lag_id'] > 0 ] 
dfLags = dfLags.groupby([SITE_IP,'lag_id'])['outSpeed'].sum().reset_index() 
dfLags['lag_id'] = 'Lag ' + dfLags['lag_id'].astype(str).str[:-2] 
dfLags.rename(columns = {'lag_id':PORT_NAME} , inplace = True) 

...

 Site ID  Port  outSpeed 
0  10.2.20.5 Lag 112 10000000000 
1  10.2.20.5 Lag 122 10000000000 
2  10.2.21.3 Lag 1 2000000000 
3  10.2.21.3 Lag 3 20000000000 
4  10.2.21.3 Lag 10 20000000000 
5 10.2.22.123 Lag 2 3000000000 
6 10.2.22.123 Lag 3 2000000000 
7 10.2.22.123 Lag 10 6000000000 
8 10.2.22.21 Lag 1 3000000000 
9 10.2.22.21 Lag 3 2000000000 
10 10.2.22.21 Lag 10 6000000000 
11 10.2.46.52 Lag 3 20000000000 
12 10.2.46.52 Lag 10 20000000000 

dfLags.shape = (13, 3)

그래서,에 대한 예를 들어 원본 DF를 완성하려면 을 Port = lag 10outSpeed = 20000000000으로 작성해야합니다.

나는 쉬운 방법을 찾지 못했습니다. 나는 원래 DF의 두 필드 (site ID,port)에 조건부 인 DFC의 outSpeed 필드를 채우는 방법을 명심해야합니다. 원래 DF가 더 커야한다는 것을 명심하십시오.

편집 : 나는이 [게시물]을 읽었으며, 나는 직면하고있는 것과 같은 문제이지만 아직 성취 할 수 없다. 이

그들이 무엇을 제안 :

values = (dfTemp[[SITE_IP,PORT_NAME]] == dfLags[[SITE_IP,PORT_NAME]]).axis(all=1) 

...하지만 실행할 때 내가 얻을 :

ValueError: Can only compare identically-labeled DataFrame objects 

내가 가까이 뻥 생각합니다. 어떤 아이디어?

[포스트] - Pandas (Python) - Update column of a dataframe from another one with conditions

+0

당신이 당신의 실제 데이터의 일부를 게시시겠습니까를, 또는 너무 많은? –

+0

실제로 큰 파일입니다. 그러나 해결책으로 보이는 무언가가있는 게시물을 발견했지만 아직 작동하지는 못합니다. 나는 그 질문을 편집했다. –

+0

'merge()'의 문제점은 무엇입니까? –

답변

2

에 따라 수정하십시오.

첫째, 몇 가지 예를 들어 데이터 :

import pandas as pd 

data1 = {"Site ID":["10.2.22.274", "10.2.46.52", "10.2.46.52", "10.2.21.3"], 
     "Port":["1/5/7", "Lag 10", "3/2/10", "1/1/7"], 
     "outSpeed":[10000000000, None, 10000000000, 3000000000]} 

data2 = {"Site ID":["10.2.20.5", "10.2.46.52", "10.2.22.21"], 
     "Port":["Lag 112", "Lag 10", "Lag 1"], 
     "outSpeed":[10000000000, 20000000000, 3000000000]} 

df1 = pd.DataFrame(data1) 
df1 
    Port  Site ID  outSpeed 
0 1/5/7 10.2.22.274 1.000000e+10 
1 Lag 10 10.2.46.52   NaN 
2 3/2/10 10.2.46.52 1.000000e+10 
3 1/1/7 10.2.21.3 3.000000e+09 

df2 = pd.DataFrame(data2) 
df2 
     Port  Site ID  outSpeed 
0 Lag 112 10.2.20.5 10000000000 
1 Lag 10 10.2.46.52 20000000000 
2 Lag 1 10.2.22.21 3000000000 

df1에서 outSpeed는 사이트 10.2.46.52, 포트 Lag 10 비어 있습니다. df2에서 해당 값을 사용하여 값을 채 웁니다.
mergeSite IDPort에, 다음 함께 새로운 outSpeed에 두 outSpeed 열을 추가, 그렇게하고 불필요한 열을 제거하려면, 다음을

merged = df1.merge(df2, on=["Site ID", "Port"], how="left") 
merged["outSpeed"] = merged.outSpeed_x.add(merged.outSpeed_y, fill_value=0) 
merged.drop(["outSpeed_x","outSpeed_y"], 1) 

    Port  Site ID  outSpeed 
0 1/5/7 10.2.22.274 1.000000e+10 
1 Lag 10 10.2.46.52 2.000000e+10 
2 3/2/10 10.2.46.52 1.000000e+10 
3 1/1/7 10.2.21.3 3.000000e+09 
+0

안녕하세요. 흥미로운 것 같습니다. 사실, 이것이 내가 마침내 성취해야 할 필요가있는 것입니다. 하지만 오류가 발생합니다 .... :-(.... :'.assign (outSpeed ​​= merged.outSpeed_x.add (merged.outSpeed_y, fill_value = 0)) NameError : 'merged'이름이 정의되지 않았습니다. ' –

+1

죄송합니다, 나는 서둘러서 물건을 압축하려하고 있습니다. 업데이트보기 –

+0

안녕하세요, 이것은 확실히 작동합니다! 그리고 추론을 이해합니다. 'dfLags'에서 데이터를 추출하는 것이 얼마나 혼란 스럽습니까? 엑셀'VLOOKUP' 방식 : 이것은 다른 것입니다. 마지막 단어 : 그것은'outSpeed_x'와'outSpeed_y' 열을 버리지 않습니다. 왜 그런지는 모르겠지만 ... 그걸로 살 수 있습니다 :-). .. 정말 고마워요! –

0
df1.loc[(df1["Port"]==df2["Port"]) & (df1["outSpeed"].empty), "outSpeed"] = df2.loc[(df1["Port"]==df2["Port"]) & (df1["outSpeed"].empty), "outSpeed"] 

당신은 mergeadd을 사용할 수 있습니다 사용되는 이름

+0

안녕하세요! 귀하의 제안을 시도했지만 오류 : "ValueError : 시리즈 길이가 일치해야 일치합니다.". 반면에'df.loc'은 행과 열 모두를 필요로합니다. 귀하의 예제에서, 당신은 '포트'만을 기반으로 일치하고있어 일치하는'사이트 IP '와'포트'둘 다 필요합니다 ... 그것은'빈 공간'을 채울 필요가있는 조합입니다 ... –

+0

위의 솔루션 앤드류 작품들. 여기 이것을 건너 뜁니다. – Rockbar