我有一个Excel文件(.xlsx(,其内容类似于下面的"xlsx"数据帧,还有一个csv文件('csv'(。
在过去的一周(大约(,大量的网络搜索让我相信python&熊猫可能是添加";os";从csv到xlsx的信息。
不幸的是,我从来没有做过任何python编码,而且,我也没有任何熊猫方面的经验:(
然而,受到许多例子的启发(最近的例子https://stackoverflow.com/a/46550754)我试过运气了。
不幸的是,在这种情况下,我的运气似乎已经不好了。
我认为我面临的问题之一是这两个文件之间没有直接的相关性。一个有(大写argh(fqdns,另一个(小写(裸主机名。
此外,xlsx数据具有几行";pre-amble";在第一列中,后面是第10行的一些标题。
因此,我尝试了各种咒语,包括.lower((和startswith(。我可能承担了很多,试图同时掌握python、pandas和jq(针对不同的问题(怎么办?
出于羞愧,我不会揭露我业余的蟒蛇黑客行为。
我所拥有的:
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