基于列数据计算从数据帧的另一行中查找数据的最快方法?

2024-04-25 23:37:34 发布

您现在位置:Python中文网/ 问答频道 /正文

如果不遍历dataframe的每一行(这对于大型数据集来说可能非常慢),我如何使用一行中两列的计算结果2*A - B,在列B中找到一个值,并从新行中从列C中提取数据,然后放入原始行的列D。你知道吗

例如,在下面的数据帧中,行22*A - B等于1。第0行的B列有一个1,因此第0行的C列中的数据应该放在第2行的D列中。你知道吗

In [1] import pandas as pd
In [2] a = [3,3,3]
In [3] b = [1,3,5]
In [4] c = [3,4,5]

In [5] df1 = pd.DataFrame({'A': a , 'B': b, 'C':c})
Out[5] print(df1)

   A  B  C
0  3  1  3
1  3  3  4
2  3  5  5

生成的数据帧应如下所示:

    A  B  C  D
0   3  1  3  5
1   3  3  4  4
2   3  5  5  3

我假设AB的每个组合只有一个唯一的值。虽然上面的例子可以通过简单地将列C转换成列D来完成,但我希望有一个更通用的解决方案,可以扩展到数据不适合转换的情况。你知道吗


Tags: 数据inimportdataframepandasas情况解决方案
2条回答

使用pd.DataFrame.eval

df1.assign(D=df1.eval('2 * A - B').map(df1.set_index('B').C))

   A  B  C  D
0  3  1  3  5
1  3  3  4  4
2  3  5  5  3

但如果你想要快的话。你知道吗

m = dict(zip(df1.B.values.tolist(), df1.C.values.tolist()))
a = df1.A.values
b = df1.B.values
z = 2 * a - b

df1.assign(D=[m[i] for i in z.tolist()])

   A  B  C  D
0  3  1  3  5
1  3  3  4  4
2  3  5  5  3

如果你能保证独特的组合,那么。。。你知道吗

mapping = dict(df[['B', 'C']].values)
df['D'] = (2 * df.A - df.B).replace(mapping)
df    
   A  B  C  D
0  3  1  3  5
1  3  3  4  4
2  3  5  5  3

创建B值到C值的映射。执行操作(2*A-B),并使用前面生成的mapping来获得适当的C值。你知道吗

如果映射不存在,则不替换计算值。如果希望将其替换为NaN,则可以使用map

df['D'] = (2 * df.A - df.B).map(mapping)
df
   A  B  C  D
0  3  1  3  5
1  3  3  4  4
2  3  5  5  3

它的工作原理与df.replace相同,但未映射的值将替换为NaN。你知道吗

相关问题 更多 >