#python #pandas #dataframe
#питон #панды #фрейм данных
Вопрос:
Я наткнулся на сложные данные и хочу представить их совершенно по-другому.
В настоящее время мой фрейм данных имеет индекс по умолчанию (пронумерованный) и 3 метки: последовательность (в которой хранятся предложения), метки (список, содержащий 20 различных строк) и оценки, которые снова являются списком (длиной 20), который соответствует списку меток, а i-й элемент в списке оценок-это оценка i-го элемента в списке меток.
Список меток сортируется по списку оценок; если метка j имеет наивысший балл в строке i, то j будет отображаться первым в списке меток; но если у другой метки самый высокий балл, она будет отображаться первой вместо этого.. так что, по сути, она сортируется по списку оценок.
Я хочу нарисовать другую картину: используйте список меток в качестве моих новых столбцов и в качестве значения, используйте соответствующие значения в списке оценок.
Например, если это то, как выглядит мой текущий фрейм данных:
d = {'sentence': ['Hello, my name is...', 'I enjoy reading books'], 'labels': [['Happy', 'Sad'],['Sad', 'Happy']],'score': [['0.9','0.1'],['0.8','0.2']]} df = pd.DataFrame(data=d) df
Я хочу сохранить первый столбец, который является предложением, но затем использовать метки, как и остальные столбцы, и заполнить его значением соответствующих баллов.
Примером вывода будет тогда:
new_format_d = {'sentence': ['Hello, my name is...', 'I enjoy reading books'], 'Happy': ['0.9', '0.2'],'Sad': ['0.1','0.2']} new_format_df = pd.DataFrame(data=new_format_df ) new_format_df
Есть ли «простой» способ выполнить это?
Комментарии:
1. Пожалуйста, приведите нужный вам образец вывода (на основе вашего примера).
2. Является ли вторая строка в
labels
is['Sad, Happy']
или['Sad', 'Happy']
?3. Добавлен пример вывода.
4. @MohammadrezaRiahi — При попытке метода pivot я получаю ошибку: «Нет числовых типов для агрегирования», я предполагаю, что это связано с тем, что числа, которые мы видим, имеют тип str. Кажется, я не могу преобразовать его с помощью .astype(int). Обратите внимание, что оценки хранятся в списке; каждое предложение (строка) имеет свой собственный список с разными оценками. Есть идеи, как я могу эффективно преобразовать его? Чтобы было ясно — каждая оценка на самом деле является строковым типом! ‘[0.9,0.1]’ поэтому я не могу просто использовать int во всем, потому что это длинная строка, содержащая ‘ [‘и т. Д
5. Вы имеете в виду, что
score
у него есть такие ценности, как это: ‘[0.9,0.1]’, ‘[0.8, 0.2]’ ?
Ответ №1:
Я, наконец, смог решить эту проблему с помощью взлома массива NumPy:
Сначала вы преобразуете списки в массивы np:
df['labels'] = df['labels'].map(lambda x: np.array(x)) df['scores'] = df['scores'].map(lambda x: np.array(x))
Затем вы перебираете метки и добавляете каждую метку по одной за раз и соответствующие ей оценки, используя логическое условие, описанное ниже:
for label in df['labels'][0]: df[label] = df_text_20[['labels','scores']].apply(lambda x: x[1][x[0]==label][0], axis=1)
Ответ №2:
Мое предложение состоит в том, чтобы изменить свой словарь, если вы можете. Сначала найдите индексы Happy
и Sad
из labels
:
happy_index = [internal_list.index('Happy') for internal_list in d['labels']] sad_index = [internal_list.index('Sad') for internal_list in d['labels']]
Затем добавьте новое имя ключей Happy
и Sad
в свой словарь:
d['Happy'] = [d['score'][cnt][index] for cnt, index in enumerate(happy_index)] d['Sad'] = [d['score'][cnt][index] for cnt, index in enumerate(sad_index)]
Наконец, удалите свои избыточные ключи и преобразуйте их в фрейм данных:
del d['labels'] del d['score'] df = pd.DataFrame(d) sentence Happy Sad 0 Hello, my name is... 0.9 0.1 1 I enjoy reading books 0.2 0.8
Комментарии:
1. Спасибо, хотя это не представило бы его так, как я хотел. Я добавил пример вывода, чтобы сделать мой вопрос более ясным. Еще раз спасибо.
2. обновленное решение выдает мне следующую ошибку: недоступный тип: «список». вместо этого я попробовал использовать .pivot. это тоже не помогло. Спасибо.
3. Извините, я проверяю, а затем обновляю свой ответ. Но теперь, когда я запускаю свое решение, оно не работает!! Ваше решение интересно.
4. Огромное спасибо. Я действительно ценю время и усилия, которые вы вложили в это. Ура!