我遇到以下问题的算法时遇到问题: 我有两个数据框,df1和df2(以下只是一个例子):
import pandas as pd
df1 = pd.DataFrame({'Col1': [1, 7, 10, 50, 73, 80 ], 'Col2': [1,2,3,4,5,6]})
df2 = pd.DataFrame({'Col1': [0, 4, 10, 80], 'Col3': [7,6,8,9]})
正如您所看到的,它们都有Col1,但值并不总是重合,但它们是按升序排列的。我想创建一个在df1上创建新列的函数,让它称之为Col4。此列上的值必须遵循以下规则来自df2:
1)如果df1和df2在Col1中具有相同的值,则Col4中的值应该是Col3中的对应值。
2)如果它们在Col1中不共享相同的值,则Col4应该是Col3中与其之前和之后的值相对应的值之间的平均值。
例如:
由于df2在Col1中没有1的值,因此Col4中的第一个条目应该是7到6之间的平均值(1介于0和4之间)。
我不知道自己是否非常清楚,但Col4的最终结果应该是:
(7 + 6)/ 2,(6 + 8)/ 2,8,(8 + 9)/ 2,(8 + 9)/ 2,9
拥有一个函数会很好,因为我必须在许多不同的数据帧上进行此操作。
我知道这是一个奇怪的问题,但感谢您的帮助!
答案 0 :(得分:0)
您可以使用pandas.merge_asof
您将df1
与df2
Col1
合并为forward
和backward
。然后,您只需平均结果。我已经将两个合并连接成一个df
列,并重命名列,以便它们不会出现相同的名称。
import pandas as pd
df = pd.concat([pd.merge_asof(df1, df2, on='Col1').rename(columns={'Col3': 'Col4_1'}),
pd.merge_asof(df1, df2, on='Col1', direction='forward')[['Col3']].rename(columns={'Col3': 'Col4_2'})], axis=1)
print(df)
# Col1 Col2 Col4_1 Col4_2
#0 1 1 7 6
#1 7 2 6 8
#2 10 3 8 8
#3 50 4 8 9
#4 73 5 8 9
#5 80 6 9 9
# Calculate the average you want, drop helper columns.
df['Col4'] = (df.Col4_1 + df.Col4_2)/2
df.drop(columns=['Col4_1', 'Col4_2'], inplace=True)
print(df)
# Col1 Col2 Col4
#0 1 1 6.5
#1 7 2 7.0
#2 10 3 8.0
#3 50 4 8.5
#4 73 5 8.5
#5 80 6 9.0