pandas: объединить два столбца в DataFrame

У меня есть 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.


person BFTM    schedule 10.06.2012    source источник


Ответы (5)


Попробуй это:

pandas.concat([df['foo'].dropna(), df['bar'].dropna()]).reindex_like(df)

Если вы хотите, чтобы эти данные стали новым столбцом bar, просто назначьте результат df['bar'].

person BrenBarn    schedule 10.06.2012
comment
Я не вижу concat как функцию в пространстве имен pandas; Я не уверен, что мне не хватает. - person BFTM; 11.06.2012
comment
Какая у вас версия панды? Функция задокументирована здесь: pandas.pydata.org/pandas- документы/стабильная/ - person BrenBarn; 11.06.2012
comment
Я запускал pandas версии 0.6.1, в которую не включена функция concat. Обновление до версии 0.7.3 добавляет concat в пространство имен. Работает как шарм! Спасибо. - person BFTM; 11.06.2012

вы можете использовать непосредственно 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)
person user1883737    schedule 21.05.2014
comment
но обратите внимание, что поскольку filldf имеет индекс 0..3, а dftot индексируется 1..4, dftot.fillna(filldf)['a'][4] будет nan. не 7.0 - person dave adelson; 07.07.2017

Более современные версии панд (по крайней мере, с 0.12) имеют combine_first() и update() для объектов DataFrame и Series. Например, если ваш DataFrame называется df, вы должны сделать:

df.bar.combine_first(df.foo)

который только изменил бы значения Nan столбца bar, чтобы они соответствовали столбцу foo, и сделал бы это на месте. Чтобы перезаписать значения, отличные от Nan, в bar значениями в foo, вы должны использовать метод update().

person dagrha    schedule 30.11.2016

Другой вариант, используйте метод .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
person openwonk    schedule 28.04.2016
comment
Спасибо за улов @Veenit - person openwonk; 30.11.2016

Вы также можете сделать это, используя numpy.

df['bar'] = np.where(pd.isnull(df['bar']),df['foo'],df['bar'])

person van_d39    schedule 01.12.2016