Ответ 1
Попробуйте следующее:
pandas.concat([df['foo'].dropna(), df['bar'].dropna()]).reindex_like(df)
Если вы хотите, чтобы эти данные стали новым столбцом bar
, просто присвойте результат df['bar']
.
У меня есть pandas DataFrame
, в котором есть несколько столбцов:
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)
где foo
и bar
являются столбцами, которые содержат одни и те же данные, но по-разному называются. Есть ли способ переместить строки, которые составляют foo
в bar
, в идеале, сохраняя имя bar
?
В конце DataFrame должен выглядеть как:
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)
То есть значения NaN, которые составляли бар, были заменены значениями из foo
.
Попробуйте следующее:
pandas.concat([df['foo'].dropna(), df['bar'].dropna()]).reindex_like(df)
Если вы хотите, чтобы эти данные стали новым столбцом bar
, просто присвойте результат df['bar']
.
вы можете использовать непосредственно fillna и назначить результат столбцу "bar"
df['bar'].fillna(df['foo'], inplace=True)
del df['foo']
общий пример:
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)
Другой вариант, используйте метод .apply()
для фрейма. Вы можете переназначить столбец с уважением к существующим данным...
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
Более современные версии pandas (начиная с как минимум 0,12) имеют методы combine_first()
и update()
для объектов DataFrame и Series, Например, если ваш DataFrame был вызван df
, вы бы сделали:
df.bar.combine_first(df.foo)
который только изменит значения Nan столбца bar
, чтобы соответствовать столбцу foo
, и будет делать это на месте. Чтобы переписать значения, отличные от Nan в bar
, с помощью параметров foo
, вы должны использовать метод update()
.
Вы можете сделать это, используя numpy
тоже.
df['bar'] = np.where(pd.isnull(df['bar']),df['foo'],df['bar'])