Pandas:根据列中的多个对象值选择行

时间:2017-04-19 19:54:38

标签: pandas dataframe where-clause

我有一个pandas数据框,其中一列包含用户信息。此列的每个记录都是一个列表,该列表又包含用户信息的字典。就像下面这样:

                                                USER                      id  
1  [{u'STATUS': u'INACTV', u'NAME': 'abc'},{u'STATUS': u'ACTV', u'NAME': 'xyz'}]  634618   
2  [{u'STATUS': u'INACTV', u'NAME': 'abc'},{u'STATUS': u'ACTV', u'NAME': 'xyz'}]  642054   
3  [{u'STATUS': u'ACTV', u'NAME': 'abc'},{u'STATUS': u'ACTV', u'NAME': 'xyz'}]  631426    

我想只选择STATUS为ACTV且NAME为abc的行。如何选择嵌套数据的行。所以在上面的df中只会选择第3行

3 个答案:

答案 0 :(得分:3)

您可以使用> sessionInfo() R version 3.3.3 (2017-03-06) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows 7 x64 (build 7601) Service Pack 1 locale: [1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252 [4] LC_NUMERIC=C LC_TIME=English_United States.1252 attached base packages: [1] stats graphics grDevices datasets utils methods base other attached packages: [1] plotly_4.5.6 ggplot2_2.2.1 loaded via a namespace (and not attached): [1] Rcpp_0.12.10 knitr_1.15.1 magrittr_1.5 munsell_0.4.3 colorspace_1.3-2 viridisLite_0.2.0 [7] R6_2.2.0 stringr_1.2.0 httr_1.2.1 plyr_1.8.4 dplyr_0.5.0 tools_3.3.3 [13] grid_3.3.3 gtable_0.2.0 DBI_0.6-1 htmltools_0.3.5 yaml_2.1.14 lazyeval_0.2.0 [19] assertthat_0.2.0 digest_0.6.12 rprojroot_1.2 tibble_1.3.0 purrr_0.2.2 RColorBrewer_1.1-2 [25] tidyr_0.6.1 base64enc_0.1-3 htmlwidgets_0.8 evaluate_0.10 rmarkdown_1.4 stringi_1.1.5 [31] backports_1.0.5 scales_0.4.1 jsonlite_1.4 遍历 USER 列,然后检查是否有任何字典满足为子集化生成布尔序列的条件:

apply

答案 1 :(得分:3)

我们可以将您的df.USER列解压缩到pd.Panel并找到相应的行。很多开销。不值得!但很酷......也许吧。我稍后会再试一次。

pn = pd.Panel({k: pd.DataFrame(v) for k, v in df.USER.iteritems()})
cond1 = pn.loc[:, :, 'STATUS'] == 'ACTV'
cond2 = pn.loc[:, :, 'NAME'] == 'abc'

df.loc[pn.loc[(cond1 & cond2).any(), :, :].items]

                                                USER      id
2  [{'STATUS': 'ACTV', 'NAME': 'abc'}, {'STATUS':...  631426

答案 2 :(得分:1)

您可以通过字符串比较过滤数据框:

df[(df['USER'].str.contains('\'STATUS\': u\'ACTV\'')) & (df['USER'].str.contains('\'NAME\': u\'abc\''))]