Как объединить несколько строк одного и того же фрейма данных? Или как объединить несколько значений одной и той же пары ключей в python?

data = [{'a': 1}, {'b': 3},{'b':4},{'b':5}, {'c': 5}, {'c':5}]

Если у меня есть такие данные, которые затем преобразуются в фрейм данных, как мне объединить пару значений ключа, чтобы я получил этот фрейм данных

index       data_title            values                                                  
0               a                   1                 
1               b                 3,4,5                  
2               c                   5 

Попробуйте data = {'value':{'a': [0], 'b': [1, 2, 3], 'c': [4, 5]}} или data = { 'data_title': ['a','b','b','b','c','c'],'value' : [1,3,4,5,5,5] } с gropby('data_title'), просто преобразуйте данные в следующий формат, выполнив магию цикла.

k33da_the_bug 24.12.2020 17:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
803
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вот один из способов получить то, что вы просите. Я не уверен, почему именно вы хотите получить этот вывод, но я уверен, что у вас есть веская причина. :)

import pandas as pd

data = [{'a': 1}, {'b': 3},{'b':4},{'b':5}, {'c': 5}, {'c':5}]

# Convert to Pandas DataFrame
df = pd.DataFrame(data)

# At first, your data look like this
print(df)
     a    b    c
0  1.0  NaN  NaN
1  NaN  3.0  NaN
2  NaN  4.0  NaN
3  NaN  5.0  NaN
4  NaN  NaN  5.0
5  NaN  NaN  5.0

# Now chain a few operations together:
# 1) "stack" the values to go from a "wide" data format to a "tall, narrow" format
# 2) reset the index so we have only columns, not a Pandas index
# 3) drop the first column (the old index) called "level_0"
df2 = df.stack().reset_index().drop(columns='level_0')

# Assign better names to the columns:
df2.columns = ('data_title', 'values')

df2 теперь выглядит так:

print(df2)
  data_title  values
0          a     1.0
1          b     3.0
2          b     4.0
3          b     5.0
4          c     5.0
5          c     5.0

Теперь, чтобы найти уникальные значения, сгруппированные по каждому data_title:

# Group by the "data_title" column, and find unique values from the "values" column
# Then reset the index again
df3 = df2.groupby('data_title')['values'].unique().reset_index()

Это дает вам это, где каждая запись «values» представляет собой Python list уникальных значений:

print(df3)
  data_title           values
0          a            [1.0]
1          b  [3.0, 4.0, 5.0]
2          c            [5.0]

Однако я думаю, что более важный вопрос заключается в том, чего вы на самом деле пытаетесь достичь? Что дальше после этого? Думаю, если бы я знал ответ на этот более важный вопрос, мы могли бы выбрать более прямой маршрут к месту назначения.

Это напоминает мне анекдот, когда кто-то в Ирландии спрашивает, как добраться до Дублина, а мужчина отвечает: «Я бы не начал здесь». :)

Я уверен, что может быть более простой подход, чем этот, с некоторым базовым пониманием списка вы также можете получить результаты.

import pandas as pd

data = [{'a': 1}, {'b': 3},{'b':4},{'b':5}, {'c': 5}, {'c':5}]

data = {
    'data_title':[k for o in data for k in list(o.keys())],
    'value':[v for o in data for v in list(o.values())] 
}

df = pd.DataFrame(data)
df.groupby('data_title')['value'].unique().reset_index()

Во-первых, вам нужно избавиться от значений NaN, поскольку они не позволят вам комбинировать числа так, как вы хотите: T перенесет DataFrame и поменяет местами столбцы со строками, а stack поместит все столбцы в один столбец, создав мультииндекс:

df2 = pd.DataFrame(df.T.stack()) 

        0
a   0   1.0
b   1   3.0
    2   4.0
    3   5.0
c   4   5.0
    5   5.0

Сброс индекса позволит вам извлечь правильные значения столбца.

df2 = df2.reset_index()[['level_0', 0]]

Поскольку вы хотели, чтобы значения были объединены с помощью ,, вам нужно будет преобразовать тип в str. Обратите внимание, что .astype(int) удалит decimal баллы из значений.

df2[0] = df2[0].astype(int).astype(str)

   level_0  0
0      a    1
1      b    3
2      b    4
3      b    5
4      c    5
5      c    5

Теперь вы можете использовать group_by, чтобы объединить уникальные значения из столбца 0 вокруг столбца level_0:

df2 = df2.groupby(by='level_0', axis=0)[0].unique().apply(','.join)

Поскольку на данном этапе у вас есть только один столбец, df2 становится Series, и нам нужно преобразовать его обратно в Dataframe и сделать окончательный reset_index:

df2 = pd.DataFrame(df2).reset_index()

    level_0 0
0      a    1
1      b    3,4,5
2      c    5

Отсюда вы можете изменить имена столбцов, и это должно соответствовать желаемым результатам.

df2.rename(columns = {'level_0':'data_title', 0:'values'}, inplace=True)
Ответ принят как подходящий

Приведенный ниже код должен помочь вам решить вашу проблему. Если вам нужен список агрегированных значений, выберите вариант 2, но если вам нужна строка агрегированных значений, выберите вариант 1.

import pandas as pd

data = [{'a': 1}, {'b': 3}, {'b': 4}, {'b': 5}, {'c': 5}, {'c': 5}]

#converting list of Dict into dataframe
df = pd.DataFrame([(i, j) for a in data for i, j in a.items()],
                  columns=['data_title', 'values'])

#option 1 : for converting the aggregate column into a string of conc values
df_str = df.groupby('data_title').aggregate(
    lambda x: ', '.join(map(str, set(x)))).reset_index()

print(df_str)

#option 2 :  for converting the aggregate column into a list of conc values
df_aslist = df.groupby('data_title').aggregate(lambda x: list(x)).reset_index()

print(df_aslist)

Выход:

Option 1:
  data_title   values
0          a        1
1          b  3, 4, 5
2          c        5

Option 2:
  data_title     values
0          a        [1]
1          b  [3, 4, 5]
2          c     [5, 5]

Другие вопросы по теме