我有一个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行
答案 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\''))]