我不太确定我是否完全理解你的问题,但如果这能解决你的挑战,请告诉我。
在 Python 中执行 Excel 类型操作的通常方法是使用框架Pandas。使用它,您可以使用 Python 代码读取、操作和保存您的 CSV 文件(以及许多其他格式)。
设置示例
编辑:确保你已经安装了熊猫,例如在您的终端中输入以下内容:pip install pandas
由于我没有您的 CSV 文件,我将使用 Pandas 创建它们,而不是使用内置的 read_csv()-方法。
import pandas as pd
csv1 = pd.DataFrame.from_dict({
"Bin_Name": ["A","B","C","D","E","F","G","H"],
"Quantity": []
}, orient="index").T
csv2 = pd.DataFrame.from_dict({
"Bin_Name": ["A","B","C","D","E","F","G","H"],
"Quantity": [43, 32, 28, 33, 37, 38, 39, 41]
}, orient="index").T
我理解您的问题的方式是,您想指定应将哪些垃圾箱从您的csv1-文件复制到您的csv2-文件。在你的例子中,你提到了这样的事情:
# Specify bins you want to copy
bins_to_copy = ["A", "B", "C", "D", "E"]
现在,有几种方法可以执行您提到的复制操作。有些比其他的好。既然你明确地说“脚本不应一次复制所有值”,我会按照你的指示给出一个建议,一个我认为是更好的方法。
解决方案 1(不好 - 使用 for 循环)
# Loop through each bin and copy cell value from csv2 to csv1
for bin_to_copy in bins_to_copy:
csv1.loc[csv1["Bin_Name"]==bin_to_copy, "Quantity"] = csv2.loc[csv2["Bin_Name"]==bin_to_copy, "Quantity"]
# OUTPUT:
> csv1
Bin_Name Quantity
0 A 43
1 B 32
2 C 28
3 D 33
4 E 37
5 F None
6 G None
7 H None
这种方法正是我相信你所要求的。但是,它有几个弱点:
- 与使用 Pandas 库中提供的更高效的内置方法相比,循环遍历行是一种非常慢的方法
- 该方法容易受到在任一 CSV 文件中有重复 bin 的情况的影响
- 该方法容易受到 bin 仅存在于其中一个 CSV 文件中的情况的影响
- 因为我们一次更新一个单元格,Pandas 不明白列的数据类型已经改变,我们仍然为缺失值留下
None(以及一个“对象”类型的列)而不是NaN(这将指示数字(浮点)列数据类型)。
如果我正确理解了您的问题,那么更好的方法如下
解决方案 2(更好 - 使用合并)
# Select the columns with bins from csv1
csv1_bins = csv1["Bin_Name"]
# Select only the rows with the desired bins from csv2
csv2_desired_bins = csv2[csv2["Bin_Name"].isin(bins_to_copy)]
# Merge the columns (just "Quantity" in this case) from csv2 to csv1 using "Bin_Name" as "merging-key"
result = pd.merge(left=csv1_bins, right=csv2_desired_bins, on="Bin_Name", how="left")
# OUTPUT
> result
Bin_Name Quantity
0 A 43
1 B 32
2 C 28
3 D 33
4 E 37
5 F NaN
6 G NaN
7 H NaN
merge()-方法更强大,可以解决我列出的解决方案 1 中的所有挑战。它也是 join()-方法的更通用版本,根据文档,它是“就像 Excel VLOOKUP 操作一样。”(这就是你提到的相当于你的 Excel)