Настройка столбцов фрейма данных из данных текущих столбцов

#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. Огромное спасибо. Я действительно ценю время и усилия, которые вы вложили в это. Ура!