Python Pandas: jak dodać zupełnie nową kolumnę do ramki danych wewnątrz operacji groupby/transform
Chcę zaznaczyć kwantyle w moich danych i dla każdego wiersza ramki danych chciałbym, aby wpis w nowej kolumnie o nazwie np. "xtile" zawierał tę wartość.
Na przykład, załóżmy, że tworzę ramkę danych w taki sposób:
import pandas, numpy as np
dfrm = pandas.DataFrame({'A':np.random.rand(100),
'B':(50+np.random.randn(100)),
'C':np.random.randint(low=0, high=3, size=(100,))})
I powiedzmy, że piszę własną funkcję, aby obliczyć kwintyl każdego elementu w tablicy. Mam do tego swoją własną funkcję, ale na przykład po prostu odnoszą się do scipy.statystyki.mstats.mquanile.
import scipy.stats as st
def mark_quintiles(x, breakpoints):
# Assume this is filled in, using st.mstats.mquantiles.
# This returns an array the same shape as x, with an integer for which
# breakpoint-bucket that entry of x falls into.
Teraz prawdziwe pytanie brzmi, jak użyj transform
, Aby dodać nową kolumnę do danych. Coś takiego:
def transformXtiles(dataFrame, inputColumnName, newColumnName, breaks):
dataFrame[newColumnName] = mark_quintiles(dataFrame[inputColumnName].values,
breaks)
return dataFrame
A następnie:
dfrm.groupby("C").transform(lambda x: transformXtiles(x, "A", "A_xtile", [0.2, 0.4, 0.6, 0.8, 1.0]))
Problem polega na tym, że powyższy kod nie doda nowej kolumny "A_xtile". Po prostu zwraca moją ramkę danych bez zmian. Jeśli najpierw dodam kolumnę pełną fałszywych wartości, takich jak NaN, o nazwie "A_xtile", to pomyślnie nadpisuje tę kolumnę, aby uwzględnić prawidłowe oznaczenia kwintyli.
Ale jest to bardzo niewygodne, aby najpierw napisać w kolumnie dla czegokolwiek w ten sposób, że mogę chcieć dodać w locie.
Zauważ, że prosta apply
nie będzie tutaj działać, ponieważ nie będzie wiedziała, jak zrozumieć sens tablic wyników o różnej wielkości dla każdej grupy.
1 answers
Jakie masz problemy z apply
? To działa dla tego przykładu zabawki tutaj i długości grup są różne:
In [82]: df
Out[82]:
X Y
0 0 -0.631214
1 0 0.783142
2 0 0.526045
3 1 -1.750058
4 1 1.163868
5 1 1.625538
6 1 0.076105
7 2 0.183492
8 2 0.541400
9 2 -0.672809
In [83]: def func(x):
....: x['NewCol'] = np.nan
....: return x
....:
In [84]: df.groupby('X').apply(func)
Out[84]:
X Y NewCol
0 0 -0.631214 NaN
1 0 0.783142 NaN
2 0 0.526045 NaN
3 1 -1.750058 NaN
4 1 1.163868 NaN
5 1 1.625538 NaN
6 1 0.076105 NaN
7 2 0.183492 NaN
8 2 0.541400 NaN
9 2 -0.672809 NaN
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-12 18:19:35