如何基于涉及另一个数据框列的条件语句创建数据框列(允许重复!)?

How to create a dataframe column (with repetition allowed!) based on conditional statements involving another dataframe column?

我有两个数据框,每个数据框都有日期时间列。 df1 有重复的日期时间,df2 没有。

我正在尝试将 df2 中的值分配给 df1 中日期时间匹配的每个位置的新列,包括 df1 中的所有重复值。

现在,我可以通过嵌套 for 循环和遍历索引值来做到这一点,但这显然很慢,而且显然被认为是数据帧的不良形式,因为它没有利用它们最优秀的方法。

示例(非功能性)代码:

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'datetime': ['3/10/2000 17:03:00', '3/10/2000 17:03:00', '3/10/2000 17:04:00'],
                'value1': [2, 3, 4],
                'value2': ['x', 'y', 'z']})
df1['datetime'] = pd.to_datetime(df1['datetime'])
print('df1',df1)

df2 = pd.DataFrame({'datetime': ['3/10/2000 17:03:00', '3/10/2000 17:04:00', '3/10/2000 17:05:00'],
                'value1': [2, 3, 4],
                'value2': ['x', 'y', 'z'],
                'value3': ['p', 'd', 'q']})
df2['datetime'] = pd.to_datetime(df2['datetime'])
print('df2',df2)

df1.loc[:, 'value3'] = df2.loc[df1.loc[:, 'datetime'] == df2.loc[:, 'datetime'], 'value3']
print('modified df1',df1)

输出:

df1              datetime  value1 value2
0 2000-03-10 17:03:00       2      x
1 2000-03-10 17:03:00       3      y
2 2000-03-10 17:04:00       4      z
df2              datetime  value1 value2 value3
0 2000-03-10 17:03:00       2      x      p
1 2000-03-10 17:04:00       3      y      d
2 2000-03-10 17:05:00       4      z      q
modified df1              datetime  value1 value2 value3
0 2000-03-10 17:03:00       2      x      p
1 2000-03-10 17:03:00       3      y    NaN
2 2000-03-10 17:04:00       4      z    NaN

注意输出(打印为“修改后的 df1”)在 df1['value3'] 中有 p, NaN, NaN 当我需要它有 p, p, d.

如何进行这项工作?我可以设置某种递归标志还是使用 .loc?

这完全是错误的方法

同样,我试图避免使用嵌套 for 循环执行此操作的错误形式(和 Pandas 警告!)。谢谢大家的帮助。

Stef 在评论中有正确的想法。

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'datetime': ['3/10/2000 17:03:00', '3/10/2000 17:03:00', '3/10/2000 17:04:00'],
                'value1': [2, 3, 4],
                'value2': ['x', 'y', 'z']})
df1['datetime'] = pd.to_datetime(df1['datetime'])
print('df1',df1)

df2 = pd.DataFrame({'datetime': ['3/10/2000 17:03:00', '3/10/2000 17:04:00', '3/10/2000 17:05:00'],
                'value1': [2, 3, 4],
                'value2': ['x', 'y', 'z'],
                'value3': ['p', 'd', 'q']})
df2['datetime'] = pd.to_datetime(df2['datetime'])
print('df2',df2)

df1 = df1.merge(df2[["datetime", "value3"]], on = "datetime", suffixes=("", ""))
print('modified df1',df1)