Excel 喜欢在某些条件下使用 python pandas 的 vlookup
Excel like vlookup using python pandas with some conditions
我需要像 Excel 那样在某些条件下使用 python/pandas 对数据帧执行 vlookup。
条件:-
我需要使用像 vlookup 一样的 Excel 在我的第二个 DataFrame 中创建一个新列 (DFM)。
如果 DFM 值为 na,则在第二个 Dataframe 的 DFM 中打印 100%。就像下面的结果数据。
在结果数据 DFM 列中,我只需要对前 10 行应用 vlookup。然后从第 11 行开始,我想一次又一次地复制前 10 行数据,但每次都在删除第一行之后。请看下面的结果示例。由于我们将在每次迭代中删除第一行,因此最后一行将是空的,因此我们需要按照条件 2 中给出的那样打印 100%。
第一个数据帧:-
S.No Cal Date DFM
1 8 01-03-2013 100.00%
1 7 01-06-2013 100.00%
1 6 01-09-2013 100.00%
1 5 01-12-2013 99.99%
1 4 01-03-2014 99.97%
1 3 01-06-2014 99.95%
1 2 01-09-2014 98.89%
1 1 01-12-2014 39.36%
1 0 01-03-2015 0.00%
1 0 01-06-2015 0.00%
1 0 01-09-2015 0.00%
1 0 01-12-2015 0.00%
1 8 01-03-2013 100.00%
1 7 01-06-2013 100.00%
1 6 01-09-2013 100.00%
1 5 01-12-2013 99.99%
1 4 01-03-2014 99.97%
1 3 01-06-2014 99.95%
1 2 01-09-2014 98.89%
1 1 01-12-2014 39.36%
1 0 01-03-2015 0.00%
1 0 01-06-2015 0.00%
1 0 01-09-2015 0.00%
1 0 01-12-2015 0.00%
1 8 01-03-2013 100.00%
1 7 01-06-2013 100.00%
1 6 01-09-2013 100.00%
1 5 01-12-2013 99.99%
1 4 01-03-2014 99.97%
1 3 01-06-2014 99.95%
1 2 01-09-2014 98.89%
1 1 01-12-2014 39.36%
1 0 01-03-2015 0.00%
1 0 01-06-2015 0.00%
1 0 01-09-2015 0.00%
1 0 01-12-2015 0.00%
第二个数据帧:-
Cal Group
1 period 1
2 period 1
3 period 1
4 period 1
5 period 1
6 period 1
7 period 1
8 period 1
9 period 1
10 period 1
1 period 1
2 period 1
3 period 1
4 period 1
5 period 1
6 period 1
7 period 1
8 period 1
9 period 1
10 period 1
1 period 1
2 period 1
3 period 1
4 period 1
5 period 1
6 period 1
7 period 1
8 period 1
9 period 1
10 period 1
结果:-
Cal Group DFM
1 period 1 39.36%
2 period 1 98.89
3 period 1 99.95%
4 period 1 99.97%
5 period 1 99.99%
6 period 1 100.00%
7 period 1 100.00%
8 period 1 100.00%
9 period 1 100.00%
10 period 1 100.00%
1 period 1 98.89
2 period 1 99.95%
3 period 1 99.97%
4 period 1 99.99%
5 period 1 100.00%
6 period 1 100.00%
7 period 1 100.00%
8 period 1 100.00%
9 period 1 100.00%
10 period 1 100.00%
1 period 1 99.95%
2 period 1 99.97%
3 period 1 99.99%
4 period 1 100.00%
5 period 1 100.00%
6 period 1 100.00%
7 period 1 100.00%
8 period 1 100.00%
9 period 1 100.00%
10 period 1 100.00%
在许多编程语言中,vlookup 的等价物是索引 SQL joins. In pandas that's either df.merge()
for columns or df.join()
的某种实现。
为了创建移动效果,我连接了每个移动片段的列表。
import pandas as pd
df1 = pd.read_csv("temp/df1.csv").drop_duplicates()
df2 = pd.read_csv("temp/df2.csv").drop_duplicates()
vlookuped = (df2.merge(df1, how="left", on=["Cal"])
.drop(columns=["S.No", "Date"]))
result = (
pd.concat([
vlookuped,
vlookuped.assign(DFM=lambda x: x["DFM"].shift(-1)),
vlookuped.assign(DFM=lambda x: x["DFM"].shift(-2))],
ignore_index=True)
.fillna("100.00%"))
此代码生成以下数据帧:
Cal Group DFM
1 period 1 39.36%
2 period 1 98.89%
3 period 1 99.95%
4 period 1 99.97%
5 period 1 99.99%
6 period 1 100.00%
7 period 1 100.00%
8 period 1 100.00%
9 period 1 100.00%
10 period 1 100.00%
1 period 1 98.89%
2 period 1 99.95%
3 period 1 99.97%
4 period 1 99.99%
5 period 1 100.00%
6 period 1 100.00%
7 period 1 100.00%
8 period 1 100.00%
9 period 1 100.00%
10 period 1 100.00%
1 period 1 99.95%
2 period 1 99.97%
3 period 1 99.99%
4 period 1 100.00%
5 period 1 100.00%
6 period 1 100.00%
7 period 1 100.00%
8 period 1 100.00%
9 period 1 100.00%
10 period 1 100.00%
我需要像 Excel 那样在某些条件下使用 python/pandas 对数据帧执行 vlookup。
条件:-
我需要使用像 vlookup 一样的 Excel 在我的第二个 DataFrame 中创建一个新列 (DFM)。
如果 DFM 值为 na,则在第二个 Dataframe 的 DFM 中打印 100%。就像下面的结果数据。
在结果数据 DFM 列中,我只需要对前 10 行应用 vlookup。然后从第 11 行开始,我想一次又一次地复制前 10 行数据,但每次都在删除第一行之后。请看下面的结果示例。由于我们将在每次迭代中删除第一行,因此最后一行将是空的,因此我们需要按照条件 2 中给出的那样打印 100%。
第一个数据帧:-
S.No Cal Date DFM
1 8 01-03-2013 100.00%
1 7 01-06-2013 100.00%
1 6 01-09-2013 100.00%
1 5 01-12-2013 99.99%
1 4 01-03-2014 99.97%
1 3 01-06-2014 99.95%
1 2 01-09-2014 98.89%
1 1 01-12-2014 39.36%
1 0 01-03-2015 0.00%
1 0 01-06-2015 0.00%
1 0 01-09-2015 0.00%
1 0 01-12-2015 0.00%
1 8 01-03-2013 100.00%
1 7 01-06-2013 100.00%
1 6 01-09-2013 100.00%
1 5 01-12-2013 99.99%
1 4 01-03-2014 99.97%
1 3 01-06-2014 99.95%
1 2 01-09-2014 98.89%
1 1 01-12-2014 39.36%
1 0 01-03-2015 0.00%
1 0 01-06-2015 0.00%
1 0 01-09-2015 0.00%
1 0 01-12-2015 0.00%
1 8 01-03-2013 100.00%
1 7 01-06-2013 100.00%
1 6 01-09-2013 100.00%
1 5 01-12-2013 99.99%
1 4 01-03-2014 99.97%
1 3 01-06-2014 99.95%
1 2 01-09-2014 98.89%
1 1 01-12-2014 39.36%
1 0 01-03-2015 0.00%
1 0 01-06-2015 0.00%
1 0 01-09-2015 0.00%
1 0 01-12-2015 0.00%
第二个数据帧:-
Cal Group
1 period 1
2 period 1
3 period 1
4 period 1
5 period 1
6 period 1
7 period 1
8 period 1
9 period 1
10 period 1
1 period 1
2 period 1
3 period 1
4 period 1
5 period 1
6 period 1
7 period 1
8 period 1
9 period 1
10 period 1
1 period 1
2 period 1
3 period 1
4 period 1
5 period 1
6 period 1
7 period 1
8 period 1
9 period 1
10 period 1
结果:-
Cal Group DFM
1 period 1 39.36%
2 period 1 98.89
3 period 1 99.95%
4 period 1 99.97%
5 period 1 99.99%
6 period 1 100.00%
7 period 1 100.00%
8 period 1 100.00%
9 period 1 100.00%
10 period 1 100.00%
1 period 1 98.89
2 period 1 99.95%
3 period 1 99.97%
4 period 1 99.99%
5 period 1 100.00%
6 period 1 100.00%
7 period 1 100.00%
8 period 1 100.00%
9 period 1 100.00%
10 period 1 100.00%
1 period 1 99.95%
2 period 1 99.97%
3 period 1 99.99%
4 period 1 100.00%
5 period 1 100.00%
6 period 1 100.00%
7 period 1 100.00%
8 period 1 100.00%
9 period 1 100.00%
10 period 1 100.00%
在许多编程语言中,vlookup 的等价物是索引 SQL joins. In pandas that's either df.merge()
for columns or df.join()
的某种实现。
为了创建移动效果,我连接了每个移动片段的列表。
import pandas as pd
df1 = pd.read_csv("temp/df1.csv").drop_duplicates()
df2 = pd.read_csv("temp/df2.csv").drop_duplicates()
vlookuped = (df2.merge(df1, how="left", on=["Cal"])
.drop(columns=["S.No", "Date"]))
result = (
pd.concat([
vlookuped,
vlookuped.assign(DFM=lambda x: x["DFM"].shift(-1)),
vlookuped.assign(DFM=lambda x: x["DFM"].shift(-2))],
ignore_index=True)
.fillna("100.00%"))
此代码生成以下数据帧:
Cal Group DFM
1 period 1 39.36%
2 period 1 98.89%
3 period 1 99.95%
4 period 1 99.97%
5 period 1 99.99%
6 period 1 100.00%
7 period 1 100.00%
8 period 1 100.00%
9 period 1 100.00%
10 period 1 100.00%
1 period 1 98.89%
2 period 1 99.95%
3 period 1 99.97%
4 period 1 99.99%
5 period 1 100.00%
6 period 1 100.00%
7 period 1 100.00%
8 period 1 100.00%
9 period 1 100.00%
10 period 1 100.00%
1 period 1 99.95%
2 period 1 99.97%
3 period 1 99.99%
4 period 1 100.00%
5 period 1 100.00%
6 period 1 100.00%
7 period 1 100.00%
8 period 1 100.00%
9 period 1 100.00%
10 period 1 100.00%