我有两个数据框,如下所示,
x y z
0 10 a 1
1 20 b 2
2 10 c 3
3 20 d 4
4 10 e 5
x a
0 10 1
1 20 1.5
对于第一个数据帧,我想创建一个新列,如果列 'z' 的值大于 'a'(来自第二个数据帧)的值,则该列将具有 '1',该列具有相同的变量 'x' , 否则为“0”。
比如当它检查这一行时
2 10 c 3
它会变成
2 10 c 3 1
简单地说,我试图编写一个方法,但我的数据非常大,所以我的解决方案似乎效率不高。也许有一些 Pandas 功能可以让它变得更容易。
答案 0 :(得分:3)
尝试在 'x' 上使用 merge
以获取同一帧中的值,然后与 np.where
进行比较以进行矢量化比较:
import numpy as np
import pandas as pd
df1 = pd.DataFrame({
'x': {0: 10, 1: 20, 2: 10, 3: 20, 4: 10},
'y': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e'},
'z': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5}
})
df2 = pd.DataFrame({
'x': {0: 10, 1: 20},
'a': {0: 1.0, 1: 1.5}
})
# Merge DF1 and DF2 on X
merged = df1.merge(df2, on='x')
# Create Check Column
merged['check'] = np.where(merged['z'] > merged['a'], 1, 0)
# Get Rid of A
merged = merged.drop(columns='a')
print(merged)
merged
:
x y z check
0 10 a 1 0
1 10 c 3 1
2 10 e 5 1
3 20 b 2 1
4 20 d 4 1
答案 1 :(得分:1)
使用 DataFrame.join
为第一个 DataFrame 中的每一行找到正确的 a
值。
import pandas as pd
df = pd.DataFrame({
"x": [10, 20, 10, 20, 10],
"y": ["a", "b", "c", "d", "e"],
"z": [1, 2, 3, 4, 5]
})
x = pd.DataFrame({"x": [10, 20], "a": [1, 1.5]})
df = df.join(x.set_index("x"), on="x")
df["z > a"] = (df["z"] > df["a"]).astype(int)
print(df)
x y z a z > a
0 10 a 1 1.0 0
1 20 b 2 1.5 1
2 10 c 3 1.0 1
3 20 d 4 1.5 1
4 10 e 5 1.0 1