繁体   English   中英

将 Pandas DataFrame 行与键/值对的字典匹配

[英]match pandas DataFrame rows with dict of key/value pairs

我希望执行以下操作:

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"} 如果有人更快地知道任何事情,我很感兴趣。 谢谢!

如果您的 df 很大,似乎创建一个新的DataFrame可能需要时间和内存。 我试过这样的事情,当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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM