如何基于文本数据在熊猫中创建半重复行?

时间:2018-09-19 15:05:54

标签: python pandas duplicates repeat

我看到了人们在这个主题上提出的其他问题,但是许多解决方案似乎都针对一些具有特殊内置函数(例如“重复”)的数学运算而设计。我试图将文本分成多行,但似乎不起作用。

我有此数据:

enter image description here

我想将每一行中的每个应用程序分解为自己的行,并保留所有其他数据。结果看起来像这样:

enter image description here

我尝试了几种“堆栈”组合或创建列表并构建新的DF,但是我不知道如何使用它来获取所有其他列数据。

我下面的部分解决方案仅产生2列而不是全部(我有大约20列和20万行的真实数据)。

import pandas as pd

data = [[1,'vuln1','App1;App2;App3'],[1,'vuln2','App1;App2;App3'],[1,'vuln3','App1;App2;App3']]
col = ['Machine','Vulnerability','Application']
df = pd.DataFrame(data, columns=col)

new_df = pd.DataFrame(df['Application'].str.split(';').tolist(), index=df['Machine']).stack()

2 个答案:

答案 0 :(得分:1)

首先,我用分号扩展数据框,然后使用melt函数创建预期的输出。

df1= pd.concat([df, df['Application'].str.split(';', expand=True)], axis=1)
df1.melt(['Machine','Vulnerability'], value_name='a').drop('variable', 1)

#    Machine Vulnerability     a
# 0        1         vuln1  App1
# 1        1         vuln2  App1
# 2        1         vuln3  App1
# 3        1         vuln1  App2
# 4        1         vuln2  App2
# 5        1         vuln3  App2
# 6        1         vuln1  App3
# 7        1         vuln2  App3
# 8        1         vuln3  App3

答案 1 :(得分:1)

您需要np.repeatdf.stack()

if re.findall(r'(%s-\d+(?:\.\d+)*):'%project,line):