使用数据帧字典并应用函数

问题描述 投票:0回答:1

我开始学习使用数据框字典。 我可以导入 Excel 文件,然后选择我想要使用的工作表,如下所示:

all_sheets = pd.ExcelFile(file.xlsx").sheet_names
all_sheets
['HB-01', 'NX2-452', 'Notes']

prefixes = ('Notes', 'Summary')
sheets_for_analysis = [x for x in all_sheets if not x.startswith(prefixes)]
sheets_for_analysis
['HB-01', 'NX2-452']

data = pd.read_excel(r"C:\Users\iancr\Desktop\dfs in dict.xlsx", sheet_name = sheets_for_analysis)
data
{'HB-01':    Unnamed: 0  Unnamed: 1    Unnamed: 2 Unnamed: 3 Unnamed: 4    Unnamed: 5  \
 0         NaN  Product ID  Product Name      Notes     Counts  Worksheet No   
 1         NaN        1000          Comb        NaN         25       367-389   
 2         NaN        1000          Comb        NaN         25       367-389   
 3         NaN        1000          Comb        NaN         25       372-112   
 4         NaN        3000         Brush  Squashed          25           763   
 5         NaN        3000         Brush        NaN         25           786   
 6         NaN        3000         Brush        NaN         25           381   
 
   Unnamed: 6  
 0     Andrew  
 1         90  
 2         86  
 3         79  
 4       < 36  
 5       < 23  
 6       < 21  ,
 'NX2-452':    Unnamed: 0  Unnamed: 1    Unnamed: 2 Unnamed: 3 Unnamed: 4 Unnamed: 5  \
 0         NaN  Product ID  Product Name   Sequence      Notes     Counts   
 1         NaN        1000          Comb          1        NaN         25   
 2         NaN        1000          Comb          2        NaN         25   
 3         NaN        1000          Comb          3        NaN         25   
 4         NaN        3000         Brush         12        NaN         25   
 5         NaN        3000         Brush         12        NaN         25   
 6         NaN        3000         Brush         13        NaN         25   
 7         NaN        9000           Air         14        NaN         25   
 8         NaN        9000           Air         15    Too hot         25   
 9         NaN        9000           Air         16        NaN         25   
 
      Unnamed: 6 Unnamed: 7 Unnamed: 8 Unnamed: 9 Unnamed: 10  
 0  Worksheet No      Susan       Neil       Paul       Cindy  
 1          8798       < 22         42         56          76  
 2          8798         32       < 32         43          56  
 3          8798         45         12         24          79  
 4           763         12         43       < 56          67  
 5           786         21         63         77          54  
 6           381         16         45         65          55  
 7           354       > 44         36         46          98  
 8           354         53         31         44          94  
 9           386         46         33         41          90  }

我想将索引 0 作为列标题并将该行放在所有数据帧上,所以:

for key, df in data.items():
    df.rename(columns=df.iloc[0], inplace =True)
    df.drop(index=df.index[0], axis=0, inplace=True)

这给出了期望的结果。

但是,然后我想对每个数据帧应用两个函数,一个应用于“产品 ID”为 Comb 的位置,另一个应用于其他所有内容。下面是两个函数,它们本质上是清理数据框中的数据并返回某些值:

def stripdata_comb(data):
    if str(data).startswith("<"):
        return '0'
    
    elif str(data).startswith(">"):
        return str(data).split(' ')[1]
    
    else:
        return data

def stripdata_no_comb(data):
    if str(data).startswith("<"):
        return str(data).split (' ')[1]
    
    elif str(data).startswith(">"):
        return str(data).split(' ')[1] 

如果我使用单个数据框,我会过滤“产品 ID”并应用函数:

comb = df[df['Product ID'] == 'Comb']
not_comb = df[df['Product ID'] != 'Comb'] 

for col in comb.columns:
       comb[col] = comb[col].apply(stripdata_comb)
for col in not_comb.columns: 
       not_comb[col] = not_comb[col].apply(stripdata_no_comb)

因此,如果我想将这些函数应用到我的数据帧字典中,我将尝试以下操作:

for key, df in data.items(): 
    comb = df[df['Product ID']=='Comb'].apply(stripdata_comb)
    not_comb = df[df['Product ID'] != 'Comb'].apply(stripdata_no_comb)

我没有收到任何错误,但字典中的数据帧没有更改。我哪里错了?

pandas dataframe dictionary
1个回答
0
投票

在最后一个代码示例中,您正在迭代

data
。但您要更新的唯一变量是
comb
not_comb
。所以不是包含所有数据帧的字典。

我想你想要的是:

for key, df in data.items(): 
   data[key][df['Product ID'] == 'Comb'] = df[df['Product ID'] == 'Comb'].apply(stripdata_comb)
   data[key][df['Product ID'] != 'Comb'] = df[df['Product ID'] != 'Comb'].apply(stripdata_no_comb)

data[key][df['Product ID'] == 'Comb']
使用此功能仅覆盖数据内部原始数据帧中
df['Product ID'] == 'Comb'
的列。

© www.soinside.com 2019 - 2024. All rights reserved.