遍历字典列表并 1) 将流值与流列元素进行比较 2) 如果匹配,则附加一个带有数据的新列表
Posted
技术标签:
【中文标题】遍历字典列表并 1) 将流值与流列元素进行比较 2) 如果匹配,则附加一个带有数据的新列表【英文标题】:loop through a dictionary list and 1) compare a flow value to the flow column element 2) if it matches then append a new list with data 【发布时间】:2019-03-12 08:20:59 【问题描述】:我有一个数据框
Sensor_Data_df="Sensor" :[2306,2305,2304,2303,2302 ], "Time" : [3.06,5.17,6.89,6.83,6.83], "Flow": [60,69,66,104,60]
我需要遍历一个列表并将流值与流列元素进行比较,如果匹配,则将传感器数据附加到一个新列表中。有数千行数据,但只有 127 个流。所以看起来嵌套循环似乎很合适,但我是 pandas 和 Python 的新手。
目标是创建一个新的字典列表如下:
flows_df="60":[2306,2302],"66":[2304],"69":[2305],"104":[2303]
我需要这样的东西,但无法获得 if 语句,因此我可以比较一个值:
dfc = pd.DataFrame('A':['aaa','bbb','ccc'],'B':[1,2,3])
print(dfc)
numrows=len(dfc.loc[:,'A'])
print("The number of elements is " + str(numrows))
z_list=[]
ilist=[0,1,2]
i=0
for i in range(len(dfc['A'])):
# if dfc[i,'A']==ilist.value()
z_list.append(dfc.loc[:,'B'])
print("____")
print(z_list)
【问题讨论】:
您能否提供一个给定输出所需输出的示例?就目前而言,很难看出dfc
与Sensor_Data_df
的关系如何,并且根据您的描述,当您提供与多个Flow
值相对应的元素时,尚不清楚预期的结果是什么(对于您给定的示例,这将是 60)。
【参考方案1】:
您可以通过在流列上使用.isin() 来测试ilist
中的流,而不是循环遍历DataFrame(效率低下,通常在使用pandas 时应避免)。
在您的示例中,A
列中的相关值可以这样提取:
dfc.loc[dfc['B'].isin(ilist), 'A']
【讨论】:
【参考方案2】:如果你让df = pd.DataFrame(Sensor_Data_df)
,那么你可以这样做
df.groupby('Flow').Sensor.apply(list).to_dict()
对于您的示例数据:
In [164]: df
Out[164]:
Sensor Time Flow
0 2306 3.06 60
1 2305 5.17 69
2 2304 6.89 66
3 2303 6.83 104
4 2302 6.83 60
In [165]: df.groupby('Flow').Sensor.apply(list).to_dict()
Out[165]: 60: [2306, 2302], 66: [2304], 69: [2305], 104: [2303]
一个可能也适合您的数据大小的纯 Python 解决方案(除非是紧密循环的一部分)并为您节省对 pandas 的依赖
from collections import defaultdict
sensors_by_flow = defaultdict(list)
for flow, sensor in zip(Sensor_Data_df['Flow'], Sensor_Data_df['Sensor']):
sensors_by_flow[flow].append(sensor)
【讨论】:
以上是关于遍历字典列表并 1) 将流值与流列元素进行比较 2) 如果匹配,则附加一个带有数据的新列表的主要内容,如果未能解决你的问题,请参考以下文章