如何根据文本数据在 pandas 中创建半重复行?
How do I create semi-duplicate rows in pandas based on text data?
我看到人们就此主题提出了其他问题,但很多解决方案似乎都是针对某些具有特殊内置函数来处理的数学运算(如 "repeat")。我试图将文本分成多行,但它似乎不起作用。
我有这个数据:
我想将每一行中的每个应用程序拆分到它自己的行中,并保留所有其他数据。结果看起来像这样:
我尝试了 "stack" 的几种组合或制作列表和构建新的 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()
首先我用分号扩展数据框,然后使用 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.repeat and df.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
我看到人们就此主题提出了其他问题,但很多解决方案似乎都是针对某些具有特殊内置函数来处理的数学运算(如 "repeat")。我试图将文本分成多行,但它似乎不起作用。
我有这个数据:
我想将每一行中的每个应用程序拆分到它自己的行中,并保留所有其他数据。结果看起来像这样:
我尝试了 "stack" 的几种组合或制作列表和构建新的 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()
首先我用分号扩展数据框,然后使用 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.repeat and df.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