python - datos - pandas union dataframe
pandas: combina dos columnas en un DataFrame (5)
Las versiones de pandas más modernas (desde al menos 0.12) tienen los combine_first()
y update()
para los objetos DataFrame y Series. Por ejemplo, si su DataFrame se llamara df
, usted haría:
df.bar.combine_first(df.foo)
que solo alteraría los valores de Nan de la columna de la bar
para coincidir con la columna foo
, y lo haría en el lugar. Para sobrescribir los valores que no son Nan en la bar
con los de foo
, usaría el método update()
.
Tengo un DataFrame
pandas que tiene varias columnas en él:
Index: 239897 entries, 2012-05-11 15:20:00 to 2012-06-02 23:44:51
Data columns:
foo 11516 non-null values
bar 228381 non-null values
Time_UTC 239897 non-null values
dtstamp 239897 non-null values
dtypes: float64(4), object(1)
donde foo
y bar
son columnas que contienen los mismos datos, pero se nombran de manera diferente. ¿Hay alguna forma de mover las filas que forman foo
en bar
, idealmente manteniendo el nombre de bar
?
Al final, el DataFrame debería aparecer como:
Index: 239897 entries, 2012-05-11 15:20:00 to 2012-06-02 23:44:51
Data columns:
bar 239897 non-null values
Time_UTC 239897 non-null values
dtstamp 239897 non-null values
dtypes: float64(4), object(1)
Es decir, los valores de NaN que componían la barra fueron reemplazados por los valores de foo
.
Otra opción, use el método .apply()
en el marco. Puede hacer reasignar una columna con deferencia a los datos existentes ...
import pandas as pd
import numpy as np
# get your data into a dataframe
# replace content in "bar" with "foo" if "bar" is null
df["bar"] = df.apply(lambda row: row["foo"] if row["bar"] == np.NaN else row["bar"], axis=1)
# note: change ''np.NaN'' with null values you have like an empty string
Prueba esto:
pandas.concat([df[''foo''].dropna(), df[''bar''].dropna()]).reindex_like(df)
Si desea que los datos se conviertan en la nueva bar
columnas, simplemente asigne el resultado a df[''bar'']
.
Puedes hacerlo usando numpy
también.
df[''bar''] = np.where(pd.isnull(df[''bar'']),df[''foo''],df[''bar''])
puede utilizar directamente fillna y asignar el resultado a la columna ''barra''
df[''bar''].fillna(df[''foo''], inplace=True)
del df[''foo'']
ejemplo general:
import pandas as pd
#creating the table with two missing values
df1 = pd.DataFrame({''a'':[1,2],''b'':[3,4]}, index = [1,2])
df2 = pd.DataFrame({''b'':[5,6]}, index = [3,4])
dftot = pd.concat((df1, df2))
print dftot
#creating the dataframe to fill the missing values
filldf = pd.DataFrame({''a'':[7,7,7,7]})
#filling
print dftot.fillna(filldf)