2017-10-21 120 views
1

你已經到達DF了。我在這裏展示了它的有趣的專欄。它在行和列中都更大:DF.shape = (185, 34)用不同DF的信息填充熊貓DF細胞

enter image description here

正如你所看到的,outSpeed字段爲空的滯後般的端口。

我已經計算出不同的DF與outSpeed爲LAG的...

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,我將不得不填寫Site ID = 10.2.46.52Port = lag 10outSpeed = 20000000000

我還沒有找到一個這樣做的簡單方法。我的意思是:如何填寫原始DF的outSpeed字段有條件的兩個字段(site ID,port),請記住,當然,原來的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

您可以使用mergeadd請修改。

首先,一些示例數據:

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 

df1outSpeed爲空網站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:name'merged'is not defined' –

+1

對不起,我很忙,試圖壓縮東西,看更新。 –

+0

嗨!是的,這確實有效!我理解你的推理。從dfLags提取數據有多混亂。 Excel 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"] 

根據您使用的名稱

+0

嗨!嘗試了你的建議,但它給了我一個錯誤:'ValueError:系列長度必須匹配比較'。另一方面:'df.loc'需要行和列。在你的例子中,你只是基於'Port'匹配,我需要'Site IP'和'Port'匹配...這就是我需要填充空outSpeed的組合... –

+0

以上解決方案來自安德魯的作品。所以在這裏跳過這個。 – Rockbar