有没有办法让这个更容易?

时间:2021-05-14 17:10:24

标签: python python-3.x pandas dataframe

我有两个数据框,如下所示,

   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 功能可以让它变得更容易。

2 个答案:

答案 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