У меня есть алгоритм обработки данных, где я хочу установить значения для ячейки на основе значения в другой строке. Все в одном и том же столбце. Мы можем сгруппировать эти строки по столбцу EID. Хорошее (то есть бланк или нет типа int/double), а не принимаю макс, я назначаю вместо этого это проблемное значение. Если есть несколько значений с неправильным типом данных, выберите любой из них. Один 1 строка будет иметь значение флага 1. < /P>
Итак, короче говоря, назначить (переопределить, если вам нужно) все максимальные значения для группы рядов с флагом = 1, а затем, как только сделано, отбросьте ряды, где флаг не является 1.Transform_fields = ('LV1','LV2')
for i in range(len(Transform_fields)):
field_name = Transform_fields
data[field_name + '_org'] = data[field_name]
try:
data[field_name] = data[field_name].astype('float')
data[field_name + '_max'] = data.groupby(['eid'])[field_name].transform(max)
data[field_name + '_max'].fillna(data[field_name + '_org'], inplace = True)
data[field_name] = data.groupby('eid')[field_name + '_max'].transform(lambda x: 0 if (x == 0).any() else x)
except Exception as e:
print('Error reading data from file ' + str(e) + ': \n')
#need to update the value of the field of the record where the PF is 1 in that group
#finally,
data = data[data['pf'] == '1']
< /code>
Некоторые образцы данных, показанные этой простой программой ниже, чтобы отобразить пример ввода DF и полученный DF -< /p>
import pandas as pd
df_in = pd.DataFrame({'eid': [10001, 10001, 10002, 10002, 10003, 10004, 10004, 10004],
'LV1': ['', -8888, -8888, -8888, -8888, '&', 33, 'TIM'],
'LV2': [-8888, 'GRAY', 'blue', 9, 22, 55, 68, 166],
'PF': [1, 0, 1, 0, 1, 1, 0, 0]})
print('Original Dataframe:')
print(df_in)
df_out = pd.DataFrame({'eid': [10001, 10002, 10003, 10004],
'LV1': ['', -8888, -8888, '&'],
'LV2': ['GRAY', 'blue', 22, 166],
'PF': [1, 1, 1, 1]})
print("\nTransformed Dataframe:")
print(df_out)
< /code>
обновление через 3 дня после первой публикации этого вопроса-< /strong> < /p>
Просто подумал, чтобы поделиться В случае, если кто -то еще читает это позже. Когда я запускаю эту программу для более крупного файла данных (включающий 103 000 строк x 125 столбцов), она не завершает запуск в разумное время. Таким образом, «transform_fields» - это список 125 элементов, данные, для которых поставляются в более крупном входном файле. /p>
Я запустил ту же программу для этого большего файла и после ок. 10 минут ожидания его завершения, я представил Queyboard Interrupt, чтобы прекратить выполнение. Просто он не очень масштабировался, даже если он использует панды (то есть векторизацию). < /P>
Я также попытался избавиться от цикла, изменив его на это ниже, и это также не Закончите запуск более 10 минут, поэтому мне пришлось снова прекратить выполнение -< /p>
# Perform the groupby operation once for all columns
agg_dict = {field: cust_max for field in Transform_fields}
out = df_in.groupby('eid', as_index=False).agg(agg_dict)
< /code>
еще не уверен, каким будет решение. Спасибо.
Подробнее здесь: https://stackoverflow.com/questions/793 ... -in-pandas