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
Вот один из способов получить то, что вы просите. Я не уверен, почему именно вы хотите получить этот вывод, но я уверен, что у вас есть веская причина. :)
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]
Попробуйте
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')
, просто преобразуйте данные в следующий формат, выполнив магию цикла.