- Метод сначала применяется к отдельным значениям.
- Если это не удается, методу передается вся серия.
def func(val):
print("Val - ", val, "\nVal Type - ", type(val), "\n")
if not isinstance(val, pd.Series):
raise TypeError("Not Series")
return val
sr = pd.Series([1,2,3,4,5])
print("-"*20, "Apply", "-"*20)
sr.apply([func]) # passed the function as a list
print("-"*20, "Apply", "-"*20)
print("-"*20, "Transform", "-"*20)
sr.transform([func]) # passed the function as a list
print("-"*20, "Transform", "-"*20)
Вывод
-------------------- Apply --------------------
Val - 1
Val Type -
Val - 0 1
1 2
2 3
3 4
4 5
dtype: int64
Val Type -
-------------------- Apply --------------------
-------------------- Transform --------------------
Val - 1
Val Type -
Val - 0 1
1 2
2 3
3 4
4 5
dtype: int64
Val Type -
-------------------- Transform --------------------
(Примечание: я видел источник для применения и преобразования, чтобы подтвердить это поведение)
Следуя этой логике, я ожидал, что метод применения/преобразования DataFrame сначала применит методы, подобные списку, к отдельным строкам или столбцам, а в случае неудачи - ко всему DataFrame. Вместо этого DataFrames не увеличивает детализацию таким образом.
def func(val):
print("Val - ", val, "\nVal Type - ", type(val), "\n")
if not isinstance(val, pd.DataFrame):
raise TypeError("Not DataFrame")
return val.iloc[0:3]
df = pd.DataFrame([[1,2],[3,4],[5,6]], columns=['A', 'B'])
df.apply([func])
--- Output
Val - 1
Val Type -
Val - 0 1
1 3
2 5
Name: A, dtype: int64
Val Type -
TypeError: Not DataFrame
Функция преобразования также выдает аналогичную ошибку. Я видел исходный код применения/преобразования фрейма данных (подробнее ниже, если вы хотите прочитать).
Моя проблема — последовательность. Кадр данных передает одно значение, а затем весь столбец/строку в функциях, подобных списку. Тогда как в обычных функциях он передает строку/столбец, а затем весь кадр данных. Почему такое поведение?
Примечания к источнику
Применить в кадре данных/transform создает словарь имен столбцов для функций. Затем он вызывает функции для каждой клавиши, в основном работая последовательно. Это здесь и здесь.
if is_list_like(func) and not is_dict_like(func):
func = cast(list[AggFuncTypeBase], func)
# Convert func equivalent dict
if is_series:
func = {com.get_callable_name(v) or v: v for v in func}
else:
func = dict.fromkeys(obj, func)
----
for name, how in func.items():
colg = obj._gotitem(name, ndim=1)
results[name] = colg.transform(how, 0, *args, **kwargs)
Подробнее здесь: https://stackoverflow.com/questions/798 ... -in-pandas
Мобильная версия