Как создать полудублированные строки в пандах на основе текстовых данных?

1

Я вижу другие вопросы, которые люди задавали по этой теме, но многие решения, похоже, ориентированы на некоторую математическую операцию со специальными встроенными функциями для ее обработки (например, "повторить"). Я пытаюсь разбить текст на несколько строк, и он, похоже, не работает.

У меня есть следующие данные:

Изображение 174551

Я хочу разбить каждое приложение в каждой строке на свою строку и сохранить все остальные данные. Результат будет выглядеть примерно так:

Изображение 174551

Я попробовал несколько комбинаций "стека" или создания списков и создания новых DF, но я не мог понять, как получить с ним все другие столбчатые данные.

Мое частичное решение ниже дает только 2 столбца вместо всех (у меня около 20 столбцов и 200 тыс. Строк реальных данных).

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()
Теги:
pandas
duplicates
repeat

2 ответа

1
Лучший ответ

Сначала я расширяю 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
  • 0
    Отличный РобДжан, спасибо! Никогда не слышал о «таянии», поэтому мне пришлось исследовать его и поиграть с его реальными данными. Хорошая вещь!
1

вам нужны np.repeat и 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
  • 0
    Спасибо, Пид, я еще не имел дело с "повторениями", так что я собираюсь проверить это. Я работал с «расплавом», но никогда не помешает узнать другой способ снятия кожи с панды.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню