我开始学习使用数据框字典。 我可以导入 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)
我没有收到任何错误,但字典中的数据帧没有更改。我哪里错了?
在最后一个代码示例中,您正在迭代
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'
的列。