亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何根據以前的列填充 NaN 值

如何根據以前的列填充 NaN 值

千巷貓影 2022-07-26 15:56:04
我有一個沒有缺失數據 (A) 但具有重復值的初始列。如何用缺失的數據填充下一列 (B) 以便填充并且左側的列在右側始終具有相同的值?我還希望任何其他列保持不變 (C)例如,這就是我所擁有的    A    B     C1   1    20    42   2    NaN   83   3    NaN   24   2    30    95   3    40    16   1    NaN   3這就是我想要的    A    B     C1   1    20    42   2    30*   83   3    40*   24   2    30    95   3    40    16   1    20*   3填充值上的星號。這需要使用非常大的數據框進行擴展。此外,如果我在左列有一個值,在單獨的觀察中右側有多個值,我將如何填充平均值?
查看完整描述

2 回答

?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

您可以使用groupbyon'A'和 usefirst來查找第一個對應的值'B'(它不會選擇NaN)。


import pandas as pd


df = pd.DataFrame({'A':[1,2,3,2,3,1], 

                   'B':[20, None, None, 30, 40, None], 

                   'C': [4,8,2,9,1,3]})


# find first 'B' value for each 'A'

lookup = df[['A', 'B']].groupby('A').first()['B']


# only use rows where 'B' is NaN

nan_mask = df['B'].isnull()


# replace NaN values in 'B' with lookup values

df['B'].loc[nan_mask] = df.loc[nan_mask].apply(lambda x: lookup[x['A']], axis=1)


print(df)

哪個輸出:


   A     B  C

0  1  20.0  4

1  2  30.0  8

2  3  40.0  2

3  2  30.0  9

4  3  40.0  1

5  1  20.0  3

如果有很多NaN值,'B'您可能希望在使用之前排除它們groupby。


import pandas as pd


df = pd.DataFrame({'A':[1,2,3,2,3,1], 

                   'B':[20, None, None, 30, 40, None], 

                   'C': [4,8,2,9,1,3]})


# Only use rows where 'B' is NaN

nan_mask = df['B'].isnull()


# Find first 'B' value for each 'A'

lookup = df[~nan_mask][['A', 'B']].groupby('A').first()['B']


df['B'].loc[nan_mask] = df.loc[nan_mask].apply(lambda x: lookup[x['A']], axis=1)


print(df)


查看完整回答
反對 回復 2022-07-26
?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

您可以先執行 sort_values,然后根據 A 列向前填充 B 列。實現這一點的方法是:


import pandas as pd

import numpy as np


x = {'A':[1,2,3,2,3,1],

     'B':[20,np.nan,np.nan,30,40,np.nan],

     'C':[4,8,2,9,1,3]}


df = pd.DataFrame(x)


#sort_values first, then forward fill based on column B

#this will get the right values for you while maintaing

#the original order of the dataframe

df['B'] = df.sort_values(by=['A','B'])['B'].ffill()

print (df)

輸出將是:


原始數據:


   A     B  C

0  1  20.0  4

1  2   NaN  8

2  3   NaN  2

3  2  30.0  9

4  3  40.0  1

5  1   NaN  3

更新數據:


   A     B  C

0  1  20.0  4

1  2  30.0  8

2  3  40.0  2

3  2  30.0  9

4  3  40.0  1

5  1  20.0  3


查看完整回答
反對 回復 2022-07-26
  • 2 回答
  • 0 關注
  • 64 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號