#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()]
. Я обновил ответ.