如何基于涉及另一个数据框列的条件语句创建数据框列(允许重复!)?
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)
我有两个数据框,每个数据框都有日期时间列。
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)