根据其他列的值从一列获取数据

时间:2018-05-20 03:10:04

标签: python pandas function

我遇到以下问题的算法时遇到问题: 我有两个数据框,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

拥有一个函数会很好,因为我必须在许多不同的数据帧上进行此操作。

我知道这是一个奇怪的问题,但感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用pandas.merge_asof

完成所需的操作

您将df1df2 Col1合并为forwardbackward。然后,您只需平均结果。我已经将两个合并连接成一个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