![](/img/trans.png)
[英]Fill NaNs of pandas.DataFrame based on condition over another column
[英]pandas: fill nans given a condition
我正在努力處理一些看似微不足道的事情,但顯然並非如此。 常規圖片: data
-熊貓數據TOTAL_VISITS
-包含(以及其他) TOTAL_VISITS
和NUM_PRINTS
列。
目標:給定num_prints
參數,找到NUM_prints = num_prints
行,並用給定的數字填充nan
。
我停下來的地方不再有意義了:
indices= data['NUM_PRINTS'] == num_prints
data.loc[indices,'TOTAL_VISITS'].fillna(5,inplace=True)
就我所知和閱讀的內容而言,這應該起作用。 實際上沒有在nans上填充任何東西,似乎它可以處理副本或其他東西,因為它不會更改原始對象中的任何東西。
什么有效:
data.loc[indices,'TOTAL_VISITS'] = 2
這確實會在num_print
條件下用2填充該列,但不考慮nans。
data['TOTAL_VISITS'].fillna(0, inplace=True)
這確實使總訪問次數中的num_prints
填充為0,但不考慮num_prints
條件。
我有點絕望,因為帶有.iloc
的常規for
循環和條件花的時間太長了,我無法處理。
我認為雙方都需要過濾器,並且僅對過濾的行應用fillna
:
np.random.seed(1213)
c = ['TOTAL_VISITS', 'A', 'NUM_PRINTS']
data = pd.DataFrame(np.random.choice([1,np.nan,3,4], size=(10,3)), columns=c)
print (data)
TOTAL_VISITS A NUM_PRINTS
0 1.0 4.0 4.0
1 NaN 3.0 1.0
2 1.0 1.0 1.0
3 4.0 3.0 3.0
4 1.0 3.0 4.0
5 4.0 4.0 3.0
6 4.0 1.0 4.0
7 NaN 4.0 3.0
8 NaN NaN 3.0
9 3.0 NaN 1.0
num_prints = 1
indices= data['NUM_PRINTS'] == num_prints
data.loc[indices,'TOTAL_VISITS'] = data.loc[indices,'TOTAL_VISITS'].fillna(100)
#alternative
#data.loc[indices,'TOTAL_VISITS'] = data['TOTAL_VISITS'].fillna(100)
print (data)
TOTAL_VISITS A NUM_PRINTS
0 1.0 4.0 4.0
1 100.0 3.0 1.0
2 1.0 1.0 1.0
3 4.0 3.0 3.0
4 1.0 3.0 4.0
5 4.0 4.0 3.0
6 4.0 1.0 4.0
7 NaN 4.0 3.0
8 NaN NaN 3.0
9 3.0 NaN 1.0
我認為這很好
data['TOTAL_VISITS'] = np.where(data['NUM_PRINTS'] == 1, 100, data['TOTAL_VISITS'])
不使用fillna
來應用邏輯的一種方法是定義一個包含您的條件的掩碼。 然后使用此掩碼通過.loc
更新系列。
以下示例適用於@jezrael中的數據。
num_prints = 1
mask = (data['NUM_PRINTS'] == num_prints) & data['TOTAL_VISITS'].isnull()
data.loc[mask, 'TOTAL_VISITS'] = 100
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.