【问题标题】:Find the minimum value of a column greater than another column value in Python Pandas在 Python Pandas 中查找大于另一列值的列的最小值
【发布时间】:2018-04-04 17:32:09
【问题描述】:

我正在使用 Python。我有两个数据框 df1 和 df2:

d1 = {'timestamp1': [88148  , 5617900, 5622548, 5645748, 6603950, 6666502], 'col01': [1, 2, 3, 4, 5, 6]}
df1 = pd.DataFrame(d1)

d2 = {'timestamp2': [5629500, 5643050, 6578800, 6583150, 6611350], 'col02': [7, 8, 9, 10, 11], 'col03': [0, 1, 0, 0, 1]}
df2 = pd.DataFrame(d2)

我想在 df1 中创建一个新列,其中 df2 的最小时间戳值大于当前 df1 时间戳,其中 df2['col03'] 为零。我就是这样做的:

df1['colnew'] = np.nan
TSs = df1['timestamp1']
for TS in TSs:
values = df2['timestamp2'][(df2['timestamp2'] > TS) & (df2['col03']==0)]
    if not values.empty:
        df1.loc[df1['timestamp1'] == TS, 'colnew'] = values.iloc[0]

它有效,但我不想使用 for 循环。有没有更好的方法来做到这一点?

【问题讨论】:

标签: python pandas


【解决方案1】:

pandas.merge_asof 用于正向

pd.merge_asof(
    df1, df2.loc[df2.col03 == 0, ['timestamp2']],
    left_on='timestamp1', right_on='timestamp2', direction='forward'
).rename(columns=dict(timestamp2='colnew'))

   col01  timestamp1     colnew
0      1       88148  5629500.0
1      2     5617900  5629500.0
2      3     5622548  5629500.0
3      4     5645748  6578800.0
4      5     6603950        NaN
5      6     6666502        NaN

【讨论】:

    【解决方案2】:

    试试apply方法。

    def func(x):
        values = df2['timestamp2'][(df2['timestamp2'] > x) & (df2['col03']==0)]
        if not values.empty:
            return values.iloc[0]
        else:
            np.NAN
    
    df1["timestamp1"].apply(func)
    

    您可以创建一个单独的函数来完成必须完成的工作。 输出是您的新列

    0    5629500.0
    1    5629500.0
    2    5629500.0
    3    6578800.0
    4          NaN
    5          NaN
    Name: timestamp1, dtype: float64
    

    这不是一个单一的解决方案,但它有助于使事情井井有条。

    猜你喜欢
    • 1970-01-01
    • 2016-12-30
    • 2021-07-25
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 2023-02-07
    • 1970-01-01
    相关资源
    最近更新 更多