使用键/值对的词典匹配pandas DataFrame行

时间:2015-11-29 02:15:00

标签: python pandas profiling

我希望做到以下几点:

df.loc[(df["first_name"] == "joko") & (df["last_name"] == "widodo"), "are_you_joko"]

但是,没有在行(df [“first_name”] ==“joko”)&中明确提供列名和值。 (df [“last_name”] ==“widodo”)。相反,我想提供键/值对的词典,例如 {“first_name”:“joko”,“last_name”:“widodo”} 。另外,我想以最快的方式实现这一目标。我目前正在使用以下内容。

tf_df = pd.DataFrame([df[k] == v for k, v in record_dict.iteritems()]).all()
df.loc[:, "are_you_joko"] = tf_df

其中 record_dict {“first_name”:“joko”,“last_name”:“widodo”} 。我很感兴趣,如果有人知道更快的事情。谢谢!

1 个答案:

答案 0 :(得分:1)

似乎创建新的DataFrame可能需要时间和时间。记忆,如果你的df很大。我试过这样的事情,len(df) = 100000时我的机器比你的机器快500倍。如果您的df很小,我猜没有区别。

In [1]:

import pandas as pd
import numpy as np
​
df = pd.DataFrame(np.random.randint(3, size=(100000,5)), columns=list('ABCDE'))
​
record_dict = dict(A=1, B=2, C=1, D=2, E=1)
In [2]:

%%timeit 
tf_df = pd.DataFrame([df[k] == v for k, v in record_dict.iteritems()]).all()
1 loops, best of 3: 2.34 s per loop
In [3]:

%%timeit
msk = None
for k, v in record_dict.iteritems():
    if msk is None:
        msk = df[k] == v
    else:
        msk = msk & (df[k] == v)       
100 loops, best of 3: 4.14 ms per loop