【问题标题】:Replace blank value in dataframe based on another column condition根据另一列条件替换数据框中的空白值
【发布时间】:2022-01-05 12:53:04
【问题描述】:

我在一个合并的数据集中有很多空白,我想用一个条件来填充它们。

我当前的代码如下所示

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 填充 部门 7 和项目是空的用 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)

希望对遇到同样问题的人有所帮助

【问题讨论】:

    标签: python pandas dataframe csv


    【解决方案1】:

    以下解决方案首先创建每个部门的地图及其最大对应项目(假设有一个),然后将该项目与具有空白项目的部门匹配。请注意,在您的数据框中,空项是空字符串 ("") 而不是 NaN

    创建地图:

    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
    

    【讨论】:

    • 我试过了,它返回这个错误ValueError: Wrong number of items passed 6, placement implies 69我试过这个来修复它values = df11.loc[df['Department'].idxmax()]它仍然返回'numpy.float64' object has no attribute 'apply'
    • @SMO 嗯。不知道为什么你会得到那个错误。当我将其复制并粘贴到新笔记本中时(连同您的数据生成代码),我得到了预期的结果。
    【解决方案2】:

    您好,我使用了下面的代码,它有效

    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)
    

    希望对遇到同样问题的人有所帮助

    【讨论】:

      猜你喜欢
      • 2021-09-29
      • 2019-09-02
      • 2019-01-31
      • 2022-07-30
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多