【发布时间】:2020-07-04 10:22:43
【问题描述】:
假设我有一个看起来像这样的 pandas 数据框:
df1 = pd.DataFrame({"Item ID":["A", "B", "C", "D", "E"], "Value1":[1, 2, 3, 4, 0],
"Value2":[4, 5, 1, 8, 7], "Value3":[3, 8, 1, 2, 0],"Value4":[4, 5, 7, 9, 4]})
print(df1)
Item_ID Value1 Value2 Value3 Value4
0 A 1 4 3 4
1 B 2 5 8 5
2 C 3 1 1 7
3 D 4 8 2 9
4 E 0 7 0 4
现在我有了第二个数据框,如下所示:
df2 = {"Item ID":["A", "C", "D"], "Value5":[4, 5, 7]}
print(df2)
Item_ID Value5
0 A 4
1 C 5
2 D 7
我想要做的是在我的两个数据框之间找到项目 ID 的匹配位置,然后将“Value5”列值添加到行的交叉点,并且仅来自 df1 的列 Value1 和 Value2(这些列可以更改每次迭代,所以这些列需要包含在一个变量中)。
我的输出应该显示:
- 4 添加到 A 行的“Value1”和“Value2”列
- 5 添加到 C 行的“Value1”和“Value2”列
-
7 添加到 D 行,列“Value1”和“Value2”
Item_ID Value1 Value2 Value3 Value4 0 A 5 8 3 4 1 B 2 5 8 5 2 C 8 6 1 7 3 D 11 15 2 9 4 E 0 7 0 4
当然,我的数据有数千行。我可以使用 for 循环来做到这一点,但这需要的时间太长了。我希望能够以某种方式对其进行矢量化。有什么想法吗?
这就是我根据@sammywemmy 的建议最终做的事情
#Takes columns names and changes them into a list
names = df1.colnames.tolist()
#Merge df1 and df2 based on 'Item_ID'
merged = df1.merge(df2, on='Item_ID', how='outer')
for i in range(len(names)):
#using assign and **, we can bring in variable names with assign.
#Then add our Value 5 column
merged = merged.assign(**{names[i] : lambda x : x[names[i]] + x.Value5})
#Only keep all the columns before and including 'Value4'
df1= merged.loc[:,:'Value4']
【问题讨论】:
-
也请发布您的预期输出
-
我可能错了 - item -id 在 A 上匹配,所以值 1 是 5,值 2 应该是 8 而不是 9; item_id C 看起来不错; E怎么了?为什么和是 E 而不是 D?
-
抱歉还在澄清问题...
-
好的。当你完成的时候。 item_ID 'A' 的值 2 应该是 8,而不是 9。除非有不同的逻辑
-
@OrangeMan 欢迎来到 SO。 +1 提供可重复的示例。
标签: python-3.x pandas dataframe slice