2012-06-10 54 views
19

Tôi có một gấu trúc DataFrame có nhiều cột trong nó:gấu trúc: kết hợp hai cột trong một 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) 

nơi foobar là cột có chứa cùng một dữ liệu chưa được đặt tên khác nhau. Có cách nào để di chuyển các hàng tạo thành foo thành bar, lý tưởng trong khi vẫn duy trì tên của bar?

Cuối cùng các DataFrame sẽ xuất hiện như:

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) 

Đó là giá trị NaN mà tạo thành thanh được thay thế bằng các giá trị từ foo.

Trả lời

21

Hãy thử điều này:

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

Nếu bạn muốn dữ liệu đó để trở thành cột mới bar, chỉ cần gán kết quả cho df['bar'].

+0

Tôi không thấy 'concat' là hàm trong không gian tên gấu trúc; Tôi không chắc chắn những gì tôi đang mất tích. – BFTM

+0

Bạn có phiên bản gấu trúc nào? Chức năng được ghi lại ở đây: http://pandas.pydata.org/pandas-docs/stable/merging.html#concatenating-objects – BrenBarn

+0

Tôi đã chạy gấu trúc ver 0.6.1 mà không có hàm concat được bao gồm. Việc nâng cấp lên phiên bản 0.7.3 mang đến concat vào không gian tên. Làm việc như một say mê! Cảm ơn. – BFTM

21

bạn có thể sử dụng trực tiếp fillna và gán kết quả vào cột 'bar'

df['bar'].fillna(df['foo'], inplace=True) 
del df['foo'] 

chung Ví dụ:

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) 
+0

nhưng lưu ý rằng vì filldf được lập chỉ mục 0..3 trong khi dftot được lập chỉ mục 1..4, dftot.fillna (filldf) ['a'] [4] sẽ là nan. không phải 7.0 –

5

Một lựa chọn khác, sử dụng phương pháp .apply() vào khung. Bạn có thể làm phân công lại một cột với chiều theo dữ liệu hiện ...

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 
+0

Cảm ơn bạn đã nắm bắt @Veenit – openwonk

3

More phiên bản gấu trúc hiện đại (ít nhất là từ 0.12) có combine_first() and update() phương pháp DataFrame và Series đối tượng. Ví dụ, nếu DataFrame của bạn được gọi là df, bạn sẽ làm gì:

df.bar.combine_first(df.foo) 

đó sẽ chỉ làm thay đổi giá trị Nan của bar cột để phù hợp với cột foo, và sẽ làm như vậy inplace. Để ghi đè các giá trị không phải Nan trong bar bằng các giá trị trong số foo, bạn sẽ sử dụng phương thức update().

2

Bạn cũng có thể thực hiện việc này bằng cách sử dụng numpy.

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

Các vấn đề liên quan