如何在Pandas中将具有相同名称的列中的文本合并为唯一列



我试图用以下格式解析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()

最新更新