Tengo un marco de datos de pandas que se ve así (es bastante grande)
date exer exp ifor mat
1092 2014-03-17 American M 528.205 2014-04-19
1093 2014-03-17 American M 528.205 2014-04-19
1094 2014-03-17 American M 528.205 2014-04-19
1095 2014-03-17 American M 528.205 2014-04-19
1096 2014-03-17 American M 528.205 2014-05-17
ahora me gustaría iterar fila por fila y a medida que avanzo por cada fila, el valor de ifor
en cada fila puede cambiar dependiendo de algunas condiciones y necesito buscar otro marco de datos.
Ahora, ¿cómo actualizo esto a medida que itero? Intenté algunas cosas, ninguna de ellas funcionó.
for i, row in df.iterrows():
if <something>:
row['ifor'] = x
else:
row['ifor'] = y
df.ix[i]['ifor'] = x
Ninguno de estos enfoques parece funcionar. No veo los valores actualizados en el marco de datos.
df.ix[i,'ifor']
.df.ix[i]['ifor']
es problemático porque es una indexación encadenada (que no es confiable en pandas).<something>
. Si su código puede ser vectorizado dependerá de esas cosas. En general, eviteiterrows
. En su caso, definitivamente debe evitarlo ya que cada fila será un tipo deobject
letraSeries
.Respuestas:
Puede asignar valores en el bucle usando df.set_value:
Si no necesita los valores de la fila, simplemente puede iterar sobre los índices de df, pero mantuve el ciclo for original en caso de que necesite el valor de la fila para algo que no se muestra aquí.
actualizar
df.set_value () ha quedado en desuso desde la versión 0.21.0, puede usar df.at () en su lugar:
fuente
El objeto Pandas DataFrame debe considerarse como una serie de series. En otras palabras, debes pensar en términos de columnas. La razón por la que esto es importante es porque cuando lo usa
pd.DataFrame.iterrows
, está iterando a través de filas como Series. Pero estas no son las Series que el marco de datos está almacenando y, por lo tanto, son nuevas Series que se crean para usted mientras itera. Eso implica que cuando intentas asignarlos, esas ediciones no terminarán reflejadas en el marco de datos original.Ok, ahora que eso está fuera del camino: ¿Qué hacemos?
Las sugerencias previas a esta publicación incluyen:
pd.DataFrame.set_value
está en desuso a partir de la versión 0.21 de Pandaspd.DataFrame.ix
está en desusopd.DataFrame.loc
está bien, pero puede funcionar en indexadores de matriz y puede hacerlo mejorMi recomendación
Uso
pd.DataFrame.at
Incluso puedes cambiar esto a:
Respuesta al comentario
fuente
Un método que puede usar es
itertuples()
, itera sobre filas de DataFrame como nombradas tuplas, con el valor de índice como primer elemento de la tupla. Y es mucho más rápido en comparación coniterrows()
. Paraitertuples()
, cada unorow
contiene suIndex
en el DataFrame, y puede utilizarloc
para establecer el valor.En la mayoría de los casos,
itertuples()
es más rápido queiat
oat
.Gracias @SantiStSupery, el uso
.at
es mucho más rápido queloc
.fuente
df.loc[row.Index, 3] = x
no funciona. Por otro lado,df.loc[row.Index, 'ifor'] = x
funciona!Debe asignar valor por
df.ix[i, 'exp']=X
o endf.loc[i, 'exp']=X
lugar dedf.ix[i]['ifor'] = x
.De lo contrario, está trabajando en una vista y debería obtener un calentamiento:
-c:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_index,col_indexer] = value instead
Pero ciertamente, el bucle probablemente debería reemplazarse mejor por algún algoritmo vectorizado para hacer un uso completo
DataFrame
como sugirió @Phillip Cloud.fuente
Bueno, si vas a iterar de todos modos, ¿por qué no usar el método más simple de todos?
df['Column'].values[i]
O si desea comparar los nuevos valores con los antiguos o algo así, ¿por qué no almacenarlo en una lista y luego agregarlo al final?
fuente
fuente
Es mejor usar
lambda
funciones usandodf.apply()
-fuente
Incremente el número MAX de una columna. Por ejemplo :
Mi salida:
Ahora, necesito crear una columna en df2 y llenar los valores de la columna que incrementan el MAX.
Nota: df2 inicialmente contendrá solo la Columna1 y la Columna2. necesitamos que se cree la columna Sortid e incremental del MAX desde df1.
fuente