我想找到特定dict键具有特定值的所有行。 不太清楚这样说,所以这里有一个例子:
data = [
{'key1' : 'value1', 'key2' : 'value2'},
{'key1' : 'value3', 'key2' : 'value4'},
{'key1' : 'value1', 'key2' : 'value5'}
]
out = data['key1' == 'value1']['key2']
我希望out
等于['value2', 'value5']
,但实际上它只返回第一个结果,即'value2'
答案 0 :(得分:5)
您可以使用 list comprehension :
[d['key2'] for d in data if d['key1'] == 'value1']
# \___ ___/ \_____ _____/ \___________ __________/
# v v v
# yield iterator filter
(注释仅用于使语法更容易理解)
所以我们迭代data
d
是迭代器。我们会检查是否d['key1'] == 'value1'
,如果是这种情况,我们会在结果列表中添加d['key2']
。
Pandas是一个允许处理(大)数据帧的包。尽管数据框架可以非常灵活,但基本(因而不是完全正确的)定义是将其视为2d表,其中每行具有相同的命名列。您可以使用以下命令安装pandas:
pip3 install pandas
(或python-2.7,pip install pandas
)
接下来我们可以通过导入它来使用pandas:
import pandas as pd
接下来,我们可以创建一个数据框:
df = pd.DataFrame(data)
这将是:
>>> df
key1 key2
0 value1 value2
1 value3 value4
2 value1 value5
现在,我们可以获得Series
个key2
key1
'value1'
为df[df['key1'] == 'value1']['key2']
的值{/ p>
>>> df[df['key1'] == 'value1']['key2']
0 value2
2 value5
Name: key2, dtype: object
这会产生:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
</startup>
<nlog autoReload="true" internalLogFile="log/internal.txt" internalLogLevel="Trace">
<variable name="brief" value="${longdate} ${level} ${logger} ${message}${onexception:inner= ${exception:format=toString,Data}} "/>
<variable name="verbose" value="${longdate} | ${machinename} | ${processid} | ${processname} | ${level} | ${logger} | ${message}${onexception:inner= ${exception:format=toString,Data}}"/>
<targets>
<target name="console" type="Console" layout="${brief}"/>
<target name="all_in" type="File" layout="${verbose}" fileName="${basedir}/log/log.txt" archiveFileName="${basedir}/log/archive/log.{#}.txt" archiveNumbering="DateAndSequence" archiveAboveSize="1048576" archiveDateFormat="yyyyMMdd" keepFileOpen="false" encoding="iso-8859-2"/>
<target name="events" type="EventLog" layout="${verbose}" source="nlog-test" onOverflow="Split"/>
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="console"/>
<logger name="*" minlevel="Trace" writeTo="all_in"/>
<logger name="*" minlevel="Fatal" maxlevel="Error" writeTo="events"/>
</rules>
</nlog>
</configuration>
对于一个简单的结果来说当然有很多工作要做,但是pandas可以用来在大型数据集的合理时间内完成复杂的查询。