2017-10-21 178 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