【发布时间】:2021-11-23 19:10:01
【问题描述】:
我有一个如下结构的数据框:
df = pd.DataFrame({
'Substance': ['(NPK) 20/10/6', '(NPK) Guayacan 10/20/30', '46%N / O%P2O5 (Urea)', '46%N / O%P2O5 (Urea)', '(NPK) DAP Diammonphosphat; 18/46/0'],
'value': [0.2, 0.4, 0.6, 0.8, .9]
})
substance value
0 (NPK) 20/10/6 0.2
1 (NPK) Guayacan 10/20/30 0.4
2 46%N / O%P2O5 (Urea) 0.6
3 46%N / O%P2O5 (Urea) 0.8
4 (NPK) DAP Diammonphosphat; 18/46/0 0.9
现在我想用物质的简称创建一个新列:
test['Short Name'] = test['Substance'].apply(lambda x: 'Urea' if
any(i in x for i in 'Urea') else '(NPK)')
最后一行代码有两个问题。首先,输出是这样的:
Substance value Short Name
0 (NPK) 20/10/6 0.2 (NPK)
1 (NPK) Guayacan 10/20/30 0.4 Urea
2 46%N / O%P2O5 (Urea) 0.6 Urea
3 46%N / O%P2O5 (Urea) 0.8 Urea
4 (NPK) DAP Diammonphosphat; 18/46/0 0.9 (NPK)
所以第二个条目也标有尿素,虽然它应该是 NPK。
此外,我的实际数据也会产生以下错误,尽管使用了原始物质名称,但有趣/令人讨厌的是,我无法用虚拟数据重现该错误。
/var/folders/tf/hzv31v4x42q4_mnw4n8ldhsm0000gn/T/ipykernel_10743/136042259.py:5: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
注意:由于我还有更多内容,我将不得不在 if/else 循环中添加更多语句。
编辑: 物质名称需要映射到以下短名称列表:
- 尿素如果物质包括尿素
- 硝酸铵钙 (CAN) 如果 物质 包括 CAN
- 磷酸二铵 (DAP),如果 物质 包括 DAP
- 其他复合 NK、NPK 肥料适用于所有其他情况
样本数据的预期输出为
Substance value Short Name
0 (NPK) 20/10/6 0.2 (NPK)
1 (NPK) Guayacan 10/20/30 0.4 (NPK)
2 46%N / O%P2O5 (Urea) 0.6 Urea
3 46%N / O%P2O5 (Urea) 0.8 Urea
4 (NPK) DAP Diammonphosphat; 18/46/0 0.9 (NPK)
编辑2: 然后我想添加一条语句,以便我收到以下输出:
Substance value Short Name
0 (NPK) 20/10/6 0.2 (NPK)
1 (NPK) Guayacan 10/20/30 0.4 (NPK)
2 46%N / O%P2O5 (Urea) 0.6 Urea
3 46%N / O%P2O5 (Urea) 0.8 Urea
4 (NPK) DAP Diammonphosphat; 18/46/0 0.9 DAP
【问题讨论】:
-
请根据您的示例数据框编辑问题以包含预期的输出。也请清楚说明
Short Name的逻辑。