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

2024-05-08 02:29:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我看到了人们在这个话题上提出的其他问题,但很多解决方案似乎都是针对一些数学运算,这些运算有特殊的内置函数来处理(比如“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()

Tags: 数据dataframedfdataapplicationcol数学machine
2条回答

首先用分号扩展dataframe,然后使用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

你需要np.repeatdf.stack()

out_df=pd.DataFrame(columns=df.columns)

out_df['Machine']=np.repeat(df['Machine'].values,repeats=len(df['Application'].str.split(';')),axis=0)
out_df['Vulnerability']=np.repeat(df['Vulnerability'].values,repeats=len(df['Application'].str.split(';')),axis=0)

out_df['Application']=df['Application'].str.split(';',expand=True).stack().values
print(out_df)
   Machine Vulnerability Application
0        1         vuln1        App1
1        1         vuln1        App2
2        1         vuln1        App3
3        1         vuln2        App1
4        1         vuln2        App2
5        1         vuln2        App3
6        1         vuln3        App1
7        1         vuln3        App2
8        1         vuln3        App3

相关问题 更多 >