自动加入python数据帧以更新它

自动加入python数据帧以更新它,python,pandas,join,dataframe,merge,Python,Pandas,Join,Dataframe,Merge,我想在python数据帧上执行自动连接来更新它。 情况是这样的,我有一个带有三列的第一个df: 输入、输出和日期。这意味着在某一特定日期,“外”项被“内”项取代 例如,这意味着从2017年1月1日起,第1项被第10项取代。 诀窍在于,截至2017年6月,第10项也被第11项取代。所以#1变成#10就变成了#11 现在,我想填充一个最终表,该表给出了到某个日期的最终关系 如果date=2017-08-01,我会得到这张表 date = pd.to_datetime("2017-08-01") da

我想在python数据帧上执行自动连接来更新它。 情况是这样的,我有一个带有三列的第一个df: 输入、输出和日期。这意味着在某一特定日期,“外”项被“内”项取代

例如,这意味着从2017年1月1日起,第1项被第10项取代。 诀窍在于,截至2017年6月,第10项也被第11项取代。所以#1变成#10就变成了#11

现在,我想填充一个最终表,该表给出了到某个日期的最终关系

如果date=2017-08-01,我会得到这张表

date = pd.to_datetime("2017-08-01")
data = [[1,11],[2,11],[10,11],[4,14]]
df_final = pd.DataFrame(data,columns=["Out","In"])
print(df_final)

   Out  In
0   1   11
1   2   11
2  10   11
3   4   14
您知道如何执行这种自动联接吗


谢谢,

您可以使用列表理解方法和.loc来定位值

import pandas as pd
import numpy as np
from datetime import datetime
data = [[1,10,"2017-01-01"],[2,10,"2017-01-01"],[10,11,"2017-06-01"],[4,14,"2017-04-01"],[5,14,"2017-12-01"],[11,18,"2017-12-01"]]
label = ["Out","In","Date"]
df = pd.DataFrame(data,columns=label)
df['Date'] = pd.to_datetime(df['Date'])
print(df)

   Out  In       Date
0    1  10    2017-01-01
1    2  10     2017-01-01
2   10  11     2017-06-01
3    4  14     2017-04-01
4    5  14     2017-12-01
5   11  18     2017-12-01

L=[]
for row in df.iterrows():
    x = row[1]['Out']
    y = row[1]['In']
    while y in df.Out.values.tolist():
        y = df.loc[df['Out'] == y,'In'].iloc[0]
    L.append((x,y))

df2 = pd.DataFrame(L, columns=['Out', 'In'])
print(df2)

Out  In
1    18
2    18
10   18
4    14
5    14
11   18

您可以使用列表理解方法和.loc来定位这些值

import pandas as pd
import numpy as np
from datetime import datetime
data = [[1,10,"2017-01-01"],[2,10,"2017-01-01"],[10,11,"2017-06-01"],[4,14,"2017-04-01"],[5,14,"2017-12-01"],[11,18,"2017-12-01"]]
label = ["Out","In","Date"]
df = pd.DataFrame(data,columns=label)
df['Date'] = pd.to_datetime(df['Date'])
print(df)

   Out  In       Date
0    1  10    2017-01-01
1    2  10     2017-01-01
2   10  11     2017-06-01
3    4  14     2017-04-01
4    5  14     2017-12-01
5   11  18     2017-12-01

L=[]
for row in df.iterrows():
    x = row[1]['Out']
    y = row[1]['In']
    while y in df.Out.values.tolist():
        y = df.loc[df['Out'] == y,'In'].iloc[0]
    L.append((x,y))

df2 = pd.DataFrame(L, columns=['Out', 'In'])
print(df2)

Out  In
1    18
2    18
10   18
4    14
5    14
11   18

你好,S Ringne,这很有效,谢谢。我在“日期”上添加了一个过滤器,以便只选择正确的组合。@Nicolas Cool:)我忽略了日期部分。如果答案正确,请接受。我仍在努力寻找最新的组合。例如,如果您仍然有11->12。那么你的代码就不起作用了。我正在努力,但仍在挣扎。在我的真实数据集中,我需要重新运行您的循环6次,以找到每次最新的值。我试图创建一个for循环,为每一行获取最新的值,所以我使用的解决方案只是一个额外的过滤器。但为了确保使用最新版本,我想将“try:y=df.loc[df['Out']==y,'In'].iloc[0]”放入一个循环中。例如,有可能在一段时间内这样做吗?@Nicolas:参见EditHello S Ringne,这很有效,谢谢。我在“日期”上添加了一个过滤器,以便只选择正确的组合。@Nicolas Cool:)我忽略了日期部分。如果答案正确,请接受。我仍在努力寻找最新的组合。例如,如果您仍然有11->12。那么你的代码就不起作用了。我正在努力,但仍在挣扎。在我的真实数据集中,我需要重新运行您的循环6次,以找到每次最新的值。我试图创建一个for循环,为每一行获取最新的值,所以我使用的解决方案只是一个额外的过滤器。但为了确保使用最新版本,我想将“try:y=df.loc[df['Out']==y,'In'].iloc[0]”放入一个循环中。例如,有可能在一段时间内完成吗?@Nicolas:请参见编辑