如何基于另一个不同的数据帧添加列值?-蟒蛇,熊猫



我有一个Excel文件(.xlsx(,其内容类似于下面的"xlsx"数据帧,还有一个csv文件('csv'(。

在过去的一周(大约(,大量的网络搜索让我相信python&熊猫可能是添加";os";从csv到xlsx的信息。

不幸的是,我从来没有做过任何python编码,而且,我也没有任何熊猫方面的经验:(

然而,受到许多例子的启发(最近的例子https://stackoverflow.com/a/46550754)我试过运气了。

不幸的是,在这种情况下,我的运气似乎已经不好了。

我认为我面临的问题之一是这两个文件之间没有直接的相关性。一个有(大写argh(fqdns,另一个(小写(裸主机名。

此外,xlsx数据具有几行";pre-amble";在第一列中,后面是第10行的一些标题。

因此,我尝试了各种咒语,包括.lower((和startswith(。我可能承担了很多,试图同时掌握pythonpandasjq(针对不同的问题(怎么办?

出于羞愧,我不会揭露我业余的蟒蛇黑客行为。

我所拥有的:

xlsx = pd.DataFrame([
["FQDN1", "4.3.2.1", "finfo1", "FINFO1"],
["FQDN2", "4.3.2.2", "finfo2", "FINFO2"],
["FQDN3", "4.3.2.3", "finfo3", "FINFO3"],
["FQDN4", "4.3.2.4", "finfo4", "FINFO4"],
])
csv  = pd.DataFrame([
["host1", "hw1", "OS1"],
["host2", "hw2", "OS2"],
["host3", "hw3", "OS3"],
],
columns=[ "Host", "hwinfo", "os"]
)

我试图实现的目标:

new = pd.DataFrame([
["FQDN1", "4.3.2.1", "finfo1", "FINFO1", "OS1"],
["FQDN2", "4.3.2.2", "finfo2", "FINFO2", "OS2"],
["FQDN3", "4.3.2.3", "finfo3", "FINFO3", "OS3"],
["FQDN4", "4.3.2.4", "finfo4", "FINFO4", ""], 
],
columns=["Host", "IP", "info1", "info2", "OS"]
)

编辑:各个领域的数字只是我缺乏想象力的表现。主机名(和FQDN((或多或少(到处都是。

还修复了DF中缺少的列。

join(?(条件是xlsx FQDN以csv主机名开头(不区分大小写(。

作为一个展览,这里有我的几个(可能相当天真(尝试:

xlsx.loc[
( xlsx['Unnamed: 1'].str.lower().str.startswith(csv['Host']) | xlsx['Unnamed: 2'].str.lower().str.startswith(csv['Host'] )
) ] = csv.loc[
( xlsx['Unnamed: 1'].str.lower().str.startswith(csv['Host']) | xlsx['Unnamed: 2'].str.lower().str.startswith(csv['Host'] )
), csv['os']].values

xlsx['Unnamed: 5'] = np.where( (xlsx['Unnamed: 1'].str.lower().str.startswith(csv['Host']) | xlsx['Unnamed: 2'].str.lower().str.startswith(csv['Host'])), csv['os'],"")

(严格来说,"魔术"应该保持不匹配的行不变,或者返回原始内容(

另一个情节转折是csv";主机";列偶尔会有一个IP#而不是主机名,这增加了我检查两者的尝试。

看起来您想要使用两个Host值中的数字创建一个键。您可以使用.str方法截取最后一个字符-1,并将其用作从第二个df加入os的键。

import pandas as pd
xlsx = pd.DataFrame([
["FQDN1", "4.3.2.1", "finfo1", "FINFO1"],
["FQDN2", "4.3.2.2", "finfo2", "FINFO2"],
["FQDN3", "4.3.2.3", "finfo3", "FINFO3"],
["FQDN4", "4.3.2.4", "finfo4", "FINFO4"]],
columns=["Host", "IP", "info1", "info2"]
)
csv  = pd.DataFrame([
["host1", "hw1", "OS1"],
["host2", "hw2", "OS2"],
["host3", "hw3", "OS3"],
],
columns=[ "Host", "hwinfo", "os"]
)
new = (
xlsx.assign(key=xlsx['Host'].str[-1])
.merge(csv.assign(key=csv['Host'].str[-1])[['key','os']],
on='key',
how='left')
)
print(new)

输出

Host       IP   info1   info2 key   os
0  FQDN1  4.3.2.1  finfo1  FINFO1   1  OS1
1  FQDN2  4.3.2.2  finfo2  FINFO2   2  OS2
2  FQDN3  4.3.2.3  finfo3  FINFO3   3  OS3
3  FQDN4  4.3.2.4  finfo4  FINFO4   4  NaN

相关内容

  • 没有找到相关文章

最新更新