#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 Я обновил свой ответ, чтобы устранить ваше беспокойство.