Извлечение элементов из списков списка во фрейме данных

#python #pandas #list #dataframe

#python #pandas #Список #фрейм данных

Вопрос:

У меня есть следующий фрейм данных

     sentence    Entity
0   The 7250 IXR-e series uses the SR OS and is ma...   [['SR OS', 'Operating_System'], ['NSP', 'Operating_System']]
1   The 7250 IXR is managed by the NSP, which prov...   [['NSP', 'Operating_System']]
2   Nokia’s feature-rich 64-bit SR OS addresses th...   [['SR OS', 'Operating_System'],['IP routing', 'Feature']]
3   The 7250 IXR-R6 uses the SR OS and is managed ...   [['SR OS', 'Operating_System'], ['NSP', 'Operating_System']]
4   The 7250 IXR-R6 is managed by the NSP   [['NSP', 'Operating_System']]
5   The NSP provides end-to-end service-aware man...    [['NSP', 'Operating_System'], ['Cloud', 'Innovation'],['IP/MPLS', 'Feature']]
 

Я хочу разделить элементы в столбце сущности на 4 других столбца

    sentence    Entity                                    e1    et1               e2        et2     
0   The 7250 IXR-e series uses the SR OS and is ma..    SR OS  Operating_System   NSP    Operating_System
 

если есть только одна пара списков списка, таких как вторая строка, я удалю эту строку, также, если столбец entity содержит более двух списков списка, подобных последней строке, я также хочу удалить эту строку.

Мне удалось сохранить первый элемент и добавить к нему список, сообщив, что идея состояла в том, чтобы сжать весь список и создать фрейм данных, но я понятия не имею, как извлечь другие строки…

 e1 = []
for i in range(10):
    a = (eval(data['Entity'].values.tolist()[i]))
    b = a[0]
    entity_one.append((b[0]))
 

Для ясного понимания, как было предложено:

{‘предложение’: {0: ‘Серия 7250 IXR-e использует ОС SR и управляется платформой Nokia Network Services Platform (NSP).’, 1: ‘7250 IXR управляется NSP, который обеспечивает интегрированное управление сетью по всей IP-сети.’, 2:’Многофункциональная 64-разрядная операционная система SR от Nokia удовлетворяет весь спектр требований к маршрутизации IP.’, 3: ‘7250 IXR-R6 использует ОС SR и управляется платформой Nokia Network Services Platform (NSP).’, 4: ‘7250 IXR-R6 управляетсяNSP’}, ‘Entity’: {0: «[[‘SR OS’, ‘Operating_System’], [‘NSP’, ‘Operating_System’]]», 1: «[[‘ NSP’, ‘Операционная система’]]», 2: «[[‘ СРOS’, ‘Operating_System’], [‘IP-маршрутизация’, ‘Функция’]]», 3: «[[‘ SR OS’, ‘Operating_System’], [‘NSP’, ‘Operating_System’]]», 4: «[[‘ NSP’, ‘Operating_System’, ‘Операционная система’]]»}}

Комментарии:

1. можете ли вы print(df.head(5).to_dict()) и вставить вывод в свой пост?

Ответ №1:

Вы можете сначала выбрать требуемый список с помощью apply ing len , а затем распаковать столбец списка напрямую, используя выражение понимания списка.

Данные

 df = pd.read_csv(io.StringIO("""
    sentence                                            Entity
0   The 7250 IXR-e series uses the SR OS and is ma...   [['SR OS', 'Operating_System'], ['NSP', 'Operating_System']]
1   The 7250 IXR is managed by the NSP, which prov...   [['NSP', 'Operating_System']]
2   Nokia’s feature-rich 64-bit SR OS addresses th...   [['SR OS', 'Operating_System'],['IP routing', 'Feature']]
3   The 7250 IXR-R6 uses the SR OS and is managed ...   [['SR OS', 'Operating_System'], ['NSP', 'Operating_System']]
4   The 7250 IXR-R6 is managed by the NSP               [['NSP', 'Operating_System']]
5   The NSP provides end-to-end service-aware man...    [['NSP', 'Operating_System'], ['Cloud', 'Innovation'], ['IP/MPLS', 'Feature']]
"""), sep=r"s{2,}", engine="python")

# Convert literal list expression to list. Not needed in real use.
import ast
df["Entity"] = df["Entity"].apply(ast.literal_eval)
 

Код

 # 1. select wanted columns (Entity length = 2)
df_ans = df[df["Entity"].apply(len) == 2]

# 2. unpack Entity column, convert to a dataframe, and merge back horizontally
df_ans = pd.concat([
    df_ans[["sentence"]],
    pd.DataFrame(df_ans["Entity"].apply(lambda lsls: [item for ls in lsls for item in ls]).to_list(),
                 columns=["e1", "et1", "e2", "et2"])
], axis=1)

# drop nan's
df_ans = df_ans[~df_ans["sentence"].isna()]
 

Результат

 print(df_ans)
                                            sentence  ...               et2
0  The 7250 IXR-e series uses the SR OS and is ma...  ...  Operating_System
2  Nokia’s feature-rich 64-bit SR OS addresses th...  ...  Operating_System
3  The 7250 IXR-R6 uses the SR OS and is managed ...  ...               NaN

print(df_ans[["e1", "et1", "e2", "et2"]])
      e1               et1          e2               et2
0  SR OS  Operating_System         NSP  Operating_System
2  SR OS  Operating_System         NSP  Operating_System
3    NaN               NaN         NaN               NaN
 

Комментарии:

1. привет @Bill Huang второе предложение — nan, не можем ли мы также получить соответствующее предложение … вместо «nan»

2. Отбросьте их использование df_ans = df_ans[~df_ans["sentence"].isna()] . Я обновил ответ.