簡體   English   中英

根據另一列條件替換 dataframe 中的空白值

[英]Replace blank value in dataframe based on another column condition

我在合並的數據集中有很多空白,我想用條件填充它們。

我當前的代碼看起來像這樣

import pandas as pd
import csv
import numpy as np
pd.set_option('display.max_columns', 500)
# Read all files into pandas dataframes
Jan = pd.read_csv(r'C:\~\Documents\Jan.csv')
Feb = pd.read_csv(r'C:\~\Documents\Feb.csv')
Mar = pd.read_csv(r'C:\~\Documents\Mar.csv')

Jan=pd.DataFrame({'Department':['52','5','56','70','7'],'Item':['2515','254','818','','']})
Feb=pd.DataFrame({'Department':['52','56','765','7','40'],'Item':['2515','818','524','','']})
Mar=pd.DataFrame({'Department':['7','70','5','8','52'],'Item':['45','','818','','']})

all_df_list = [Jan, Feb, Mar]
appended_df = pd.concat(all_df_list)
df = appended_df
df.to_csv(r"C:\~\Documents\SallesDS.csv", index=False)

數據集:

df
Department     Item
52             2515
5              254
56             818
70
7              50
52             2515
56             818
765            524
7
40
7              45
70
5              818
8
52

我想要的是用 Department 列的對應值填充 Item 中的空單元格。

因此,如果 Department 為 52 並且 Item 為空,則應填充 2515 Department 7 而 Item 為空,則填充 45,結果應如下所示

df
Department     Item
52             2515
5              254
56             818
70
7              50
52             2515
56             818
765            524
7              45
40
7              45
70
5              818
8
52             2515

我嘗試了以下方法,但沒有一個有效。 1

df.loc[(df['Item'].isna()) & (df['Department'].str.contains(52)), 'Item'] = 2515
df.loc[(df['Item'].isna()) & (df['Department'].str.contains(7)), 'Item'] = 45

2

df["Item"] = df["Item"].fillna(df["Department"])
df = df.replace({"Item":{"52":"2515", "7":"45"}})

ethir 都返回錯誤或不工作


回答:

嗨我已經使用了下面的代碼並且它有效

b = [52]
df.Item=np.where(df.Department.isin(b),df.Item.fillna(2515),df.Item)
a = [7]
df.Item=np.where(df.Department.isin(a),df.Item.fillna(45),df.Item)

希望它可以幫助面臨同樣問題的人

以下解決方案首先創建每個部門的 map 及其最大對應項目(假設有一個),然后將該項目與具有空白項目的部門匹配。 請注意,在您的數據框中,空項是空字符串 ( "" ) 而不是NaN

創建 map:

values = df.groupby('Department').max()
values['Item'] = values['Item'].apply(lambda x: np.nan if x == "" else x)
values = values.dropna().reset_index()

    Department  Item
0   5   818
1   52  2515
2   56  818
3   7   45
4   765 524

然后使用df.apply()

df['Item'] = df.apply(lambda x: values[values['Department'] == x['Department']]['Item'].values if x['Item'] == "" else x['Item'], axis=1)

在這種情況下,新值將帶有括號。 可以使用str.replace()刪除它們:

df['Item'] = df['Item'].astype(str).str.replace(r'\[|\'|\'|\]', "", regex=True)

結果:

Department  Item
0   52  2515
1   5   254
2   56  818
3   70  
4   7   45
0   52  2515
1   56  818
2   765 524
3   7   45
4   40  
0   7   45
1   70  
2   5   818
3   8   
4   52  2515

嗨我已經使用了下面的代碼並且它有效

b = [52]
df.Item=np.where(df.Department.isin(b),df.Item.fillna(2515),df.Item)
a = [7]
df.Item=np.where(df.Department.isin(a),df.Item.fillna(45),df.Item)

希望它可以幫助面臨同樣問題的人

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM