Итак, я создаю серию сопоставлений столбцов, я могу сделать это вручную вот так

#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

0
Zizi96 25 Фев 2021 в 03:18

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 или как удалить один элемент из последовательности.

1
Prune 25 Фев 2021 в 00:27

Собрав фрейм данных, вы можете использовать метод 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'}]
1
Cameron Riddell 25 Фев 2021 в 00:36