Làm thế nào để điền giá trị thiếu dựa trên các cột khác trong khung dữ liệu Pandas?


17

Giả sử tôi có khung dữ liệu 5 * 3 trong đó cột thứ ba chứa giá trị thiếu

1 2 3
4 5 NaN
7 8 9
3 2 NaN
5 6 NaN

Tôi hy vọng tạo ra giá trị cho quy tắc dựa trên giá trị bị thiếu đó là cột thứ hai của sản phẩm đầu tiên

1 2 3
4 5 20 <--4*5
7 8 9
3 2 6 <-- 3*2
5 6 30 <-- 5*6

Làm thế nào tôi có thể làm nó sử dụng khung dữ liệu? Cảm ơn.

Làm thế nào để thêm điều kiện để tính giá trị thiếu như thế này?

if 1st % 2 == 0 then 3rd = 1st * 2nd else 3rd = 1st + 2nd

1 2 3
4 5 20 <-- 4*5 because 4%2==0
7 8 9
3 2 5 <-- 3+2 because 3%2==1
5 6 11 <-- 5+6 because 5%2==1

Bạn không thể làm điều này vì kích thước sẽ không bằng nhau
Mayur Dangar 7/07/18

Bạn có thể mở rộng câu trả lời của bạn? Tại sao điều đó là không thể và anh ta có thể làm gì để giải quyết vấn đề?
Damian Melniczuk

hey thậm chí tôi có cùng một câu hỏi. Nhưng nếu dữ liệu tôi xử lý là văn bản thì sao? đó là điều kiện giống như "nếu 'thành phần' chứa gà thì 'type' = non-veg"
user7389747

Câu trả lời:


17

Giả sử ba cột của dataframe của bạn được a, bc. Đây là cái bạn muốn:

df['c'] = df.apply(
    lambda row: row['a']*row['b'] if np.isnan(row['c']) else row['c'],
    axis=1
)

Mã đầy đủ:

df = pd.DataFrame(
    np.array([[1, 2, 3], [4, 5, np.nan], [7, 8, 9], [3, 2, np.nan], [5, 6, np.nan]]), 
    columns=['a', 'b', 'c']
)
df['c'] = df.apply(
    lambda row: row['a']*row['b'] if np.isnan(row['c']) else row['c'],
    axis=1
)

Một vài năm muộn nhưng điều này chỉ hoạt động khi các cột là số. np.isnankhông hỗ trợ dữ liệu không phải là số. Đây không phải là vấn đề ở đây vì OP có các cột số và các phép toán số học, nhưng nếu không thì pd.isnulllà một sự thay thế tốt hơn.
Adarsh ​​Chavakula

3

Một lựa chọn khác:

df.loc[(pd.isnull(df.C)), 'C'] = df.A * df.B


2

Giả sử rằng ba cột trong dataframe của bạn a, bc. Sau đó, bạn có thể thực hiện các thao tác cần thiết như thế này:

values = df['a'] * df['b']
df['c'] = values.where(df['c'] == np.nan, others=df['c'])

1
Hoặcnp.where(pd.isnull(df.c), df.a * df.b, df.c)
Valentas

1

Còn việc sử dụng fillna()phương pháp của dataframe thì sao?

df['C'].fillna(df.A * df.B)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.