Создайте новый столбец карты из существующих столбцов с помощью python pandas

#python #pandas

#python #pandas

Вопрос:

У меня есть фрейм данных pandas, который имеет переменное количество столбцов, таких как C1, C2, C3, F1, F2 … F100. Мне нужно объединить F1, F2 .. F100 в один столбец типа данных dict / map следующим образом. Как я могу это сделать, используя pandas? C1, C2, C3 — столбцы с фиксированным именем, в то время как F1, F2, F100 являются переменными.

Ввод:

 C1  C2  C3  F1  F2  F100

"1" "2" "3" "1" "2" "100"
  

Вывод:

 C1  C2  C3  Features

"1" "2" "3" {"F1":"1", "F2":"2", "F100": "100"}
  

Комментарии:

1. Итак, pyspark или pandas ?

2. Это pandas, а не pyspark

3. Вы уже задавали этот вопрос в pyspark и в spark-scala. Теперь это pandas. Что вы пытаетесь сделать?

4. Всего неделю спустя меня попросили реализовать три версии моих скриптов…

Ответ №1:

filter to_dict

 df['Features'] = df.filter(like='F').to_dict('records')
  

Вывод: df

   C1 C2 C3 C4 F1 F2 F3 F4                                      Features
0  1  2  3  4  5  6  7  8  {'F1': '5', 'F2': '6', 'F3': '7', 'F4': '8'}
1  x  y  z  w  r  e  s  t  {'F1': 'r', 'F2': 'e', 'F3': 's', 'F4': 't'}
2  a  b  c  d  d  f  g  h  {'F1': 'd', 'F2': 'f', 'F3': 'g', 'F4': 'h'}
  

Ответ №2:

Если вы используете pandas, вы можете использовать df.apply() функцию для этого.

Код будет выглядеть:

 def merge(row):
    result = {}
    for idx in row.index:
        if idx.startswith('F'):
            result[idx] = row[idx]
    print(result)
    return result

df['FEATURE'] = df.apply(lambda x: merge(x), axis=1)
  

Результаты:

     C1  C2  C3  F1  F2  F100    FEATURE
0   1   2   3   1   2   100     {'F1': 1, 'F100': 100, 'F2': 2}
1   11  21  31  11  21  1001    {'F1': 11, 'F100': 1001, 'F2': 21}
2   12  22  32  2   22  2002    {'F1': 2, 'F100': 2002, 'F2': 22}
  

Комментарии:

1. У меня это работает! Есть ли какие-либо проблемы с производительностью функции, если я обрабатываю большие данные?

2. Зависит от того, насколько «велики» ваши данные. Сначала запустите код и посмотрите на производительность. Вы можете использовать timeit метод для оценки.

Ответ №3:

Рассмотрим следующий пример.

 d = pd.DataFrame([list('12345678'), list('xyzwrest'), list('abcddfgh')], columns = 'C1, C2, C3, C4, F1, F2, F3, F4'.split(', '))

d

>>>    C1   C2  C3  C4  F1  F2  F3  F4
     0  1   2   3   4   5   6   7   8
     1  x   y   z   w   r   e   s   t
     2  a   b   c   d   d   f   g   h
  

Давайте определим Features столбец следующим образом:

 d['Features'] = d.apply(lambda row: {feat: val for feat, val in row.items() if feat.startswith('F')}, axis =1)

#so that when we call d the results will be
d
>>> C1  C2  C3  C4  F1  F2  F3  F4  Features
0   1   2   3   4   5   6   7   8   {'F1': '5', 'F2': '6', 'F3': '7', 'F4': '8'}
1   x   y   z   w   r   e   s   t   {'F1': 'r', 'F2': 'e', 'F3': 's', 'F4': 't'}
2   a   b   c   d   d   f   g   h   {'F1': 'd', 'F2': 'f', 'F3': 'g', 'F4': 'h'}
  

Я надеюсь, что это поможет.

Комментарии:

1. отклонено, поскольку ваше решение включает в себя запись времени для n столбцов n , также это неверно, потому что должны быть агрегированы только f столбцов

2. для столбцов карты мне нужны исходные столбцы с ключами.

3. @ChiCHEN Я обновил ответ, чтобы устранить ваши опасения. Дайте мне знать, если вам поможет это редактирование.

4. @aws_apprentice Я обновил свой ответ, чтобы устранить ваше беспокойство.