【问题标题】:Auto join a python dataframe to update it自动加入 python 数据框以更新它
【发布时间】:2017-08-21 09:22:31
【问题描述】:

我想对 python 数据框执行自动连接以更新它。 这是情况,我有一个包含三列的第一个df: 入、出和日期。这意味着在特定日期将“Out”项替换为“In”。

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"]]
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

例如,这意味着从 2017 年 1 月 1 日起,项目 #1 被项目 #10 替换。 诀窍是,截至 2017 年 6 月,第 10 项也被第 11 项取代。所以 #1 变成 #10 再变成 #11。

现在我想填充一个最终关系表,它给出了某个日期之前的最终关系。

如果日期 = 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

您知道如何执行这样的自动加入吗?

谢谢,

【问题讨论】:

    标签: python pandas join dataframe merge


    【解决方案1】:

    您可以使用列表理解方法和 .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:见编辑
    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    • 2020-10-13
    • 2016-02-22
    • 1970-01-01
    • 2011-03-20
    • 2019-08-09
    相关资源
    最近更新 更多