我试图用以下格式解析whois数据库文件,其中每个"inetnum";它的以下属性表示最后一个表中的一行。文件如下:
inetnum: inetnum_example1
netname: netname_example1
descr: descr_example1
descr: descr_example1
status: status_example1
mnt-by: mnt-by_example1
inetnum: inetnum_example2
netname: netname_example2
status: status_example2
mnt-by: mnt-by_example2
mnt-by: mnt-by_example2
inetnum: inetnum_example3
netname: netname_example3
...
最后的结果是这样的:
row descr descr_1 inetnum mnt-by mnt-by_1 netname status
0 1 descr_example1 descr_example1 inetnum_example1 mnt-by_example1 NaN netname_example1 status_example1
1 2 NaN NaN inetnum_example2 mnt-by_example2 mnt-by_example2 netname_example2 status_example2
2 3 NaN NaN inetnum_example3 NaN NaN netname_example3 NaN
为此,我使用以下脚本。然而,正如您所看到的,一些具有相同名称的列被标记为数字,并被独立处理。
我的问题是:由于列值将始终是字符串,是否有方法将具有相同名称的列中的所有值连接为一个值使用前面的示例,第一行将只有一个";descr";列,两个先前的值串联,并且对于";由";列。
所需输出(分隔符可以是任何随机字符(集(,在本例中为","(:
row descr inetnum mnt-by netname status
0 1 descr_example1,descr-example1 inetnum_example1 mnt-by_example1 netname_example1 status_example1
1 2 NaN inetnum_example2 mnt-by_example2,mnt-by-example2 netname_example2 status_example2
2 3 NaN inetnum_example3 NaN netname_example3 NaN
任何想法都将不胜感激,非常感谢您的时间
脚本:
import pandas
import sys
mydb = pandas.read_table(sys.argv[1], encoding="ISO-8859-1", header=None)
mydb.columns = ['data']
mydb = mydb['data'].str.split(': ',1,expand=True)
mydb = mydb.set_index([0,(mydb[0] == 'inetnum').cumsum().rename('row')])
mydb = mydb.set_index(mydb.groupby([0,'row']).cumcount(), append=True)
mydb = mydb.reset_index('row')
mydb.index = mydb.index.map('{0[0]}_{0[1]}'.format)
mydb = mydb.set_index(['row'], append=True)[1].unstack(0)
mydb = mydb.rename(columns=lambda x: x.split('_0')[0]).reset_index()
print(mydb)
如果我说对了:
mydb['descr'] = mydb['descr'] + ', ' + mydb['descr_1']
Do:
from itertools import combinations
same = [(i, j) for i,j in combinations(mydb, 2) if mydb[i].equals(mydb[j])]
print(same) #list of tuples, each tuple show duplicate columns
for i in same:
mydb[i[0]] = mydb[i[0]].astype(str) + ', ' + mydb[i[1]].astype(str)
mydb.drop([i[1]], inplace = True, axis = 1)
mydb
最终片段:
mydb = pandas.read_table(dbfile, encoding="ISO-8859-1", header=None)
mydb.columns = ['data']
mydb = mydb['data'].str.split(r':s*',1,expand=True)
mydb = mydb.set_index([0,(mydb[0] == delimiter).cumsum().rename('register')])
mydb = mydb.groupby([0,'register'], sort=False).agg(" || ".join)
mydb = mydb.reset_index('register')
mydb = mydb.set_index(['register'], append=True)[1].unstack(0)
mydb = mydb.rename(columns=lambda x: x.split()[0]).reset_index()