Итак, я создаю серию сопоставлений столбцов, я могу сделать это вручную вот так
#Produces a list of dictionaries
def create_seed_dict(column, dataset):
seed_col_vals = dataset[column].values.tolist()
seed_col_keys =[column] * (len(seed_col_vals))
seed_col_map = list(zip(seed_col_keys, seed_col_vals))
seed_dict = []
for k,v in seed_col_map:
diction = {}
diction[k] = v
seed_dict.append(diction)
return seed_dict, seed_col_map
#Create dummy dataframe
num = [1, 2, 3]
color = ['red', 'white', 'black']
value = [255, 256, 257]
dict = {'Number': num, 'Color': color, 'Score': value}
df = pd.DataFrame(dict)
Num_seed_Dict,Num_map = create_seed_dict('Number', df)
print(Num_seed_Dict)
-----------------------------
Out[1]: [{'Number': 1}, {'Number': 2}, {'Number': 3}]
Функция создает отображение значения и его столбца. Отлично, теперь я хочу сделать это более общим.
В настоящее время, если мне нужно сопоставить 2 столбца, например, я запускаю следующее:
num_vals = df['Number'].values.tolist()
num_keys =['Number'] * (len(num_vals))
num_map = list(zip(num_keys, num_vals))
numDict = []
for k,v in num_map:
diction = {}
diction[k] = v
numDict.append(diction)
color_vals = df['Color'].values.tolist()
color_keys =['Color'] * (len(color_vals))
color_map = list(zip(color_keys, color_vals))
colorDict = []
for k,v in num_map:
diction = {}
diction[k] = v
colorDict.append(diction)
colorNum_Dict = []
for (f,b) in zip(num_map, color_map):
diction = {}
diction[f[0]] = f[1]
diction[b[0]] = b[1]
colorNum_Dict.append(diction)
print(colorNum_Dict)
-----------------------------
[{'Number': 1, 'Color': 'red'}, {'Number': 2, 'Color': 'white'}, {'Number': 3, 'Color': 'black'}]
Также работает, но не идеально, если у меня много столбцов. Мой вопрос: как сделать первую функцию действительной для более чем 1 столбца?
Моя основная проблема заключается в том, что строка for (f,b) in zip(num_map, color_map):
, я не знаю, как динамически определять (f, b ..), чтобы соответствовать количеству _maps
, которые у меня есть в zip
2 ответа
Вам просто нужно принять их в кортеж. Пифонический способ создания произвольного количества переменных - это последовательность. zip
уже возвращает вам список.
a = [1, 2, 3]
b = [True, False, False]
c = ['x', 'y', 'z']
abc = [a, b, c]
for several in zip(*abc):
print(several)
Выход:
(1, True, 'x')
(2, False, 'y')
(3, False, 'z')
После этого вы можете использовать len (несколько) в качестве управляющего значения для работы с этими элементами. Если вы хотите использовать первый элемент как ключ, а остальные как значение:
diction[several[0]] = lsit(several[1:])
Если вы хотите ввести каждый элемент в качестве ключа, а остальные - в качестве значений, просто выполните итерацию several
, используя указанный элемент в качестве ключа, а остальные в качестве значения. Если вы не знаете, как это сделать, посмотрите slice notation
или как удалить один элемент из последовательности.
Собрав фрейм данных, вы можете использовать метод to_dict
, чтобы получить тот же результат:
>>> print(df)
Number Color Score
0 1 red 255
1 2 white 256
2 3 black 257
# Select columns, then call `to_dict`
>>> color_num_records = df[["Number", "Color"]].to_dict("records")
>>> print(color_num_records)
[{'Number': 1, 'Color': 'red'}, {'Number': 2, 'Color': 'white'}, {'Number': 3, 'Color': 'black'}]
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.