遍历字典列表,然后1)将流值与流列元素进行比较2)如果匹配,则在新列表中附加数据

时间:2018-10-07 13:46:43

标签: python pandas loops dictionary dataframe

我有一个数据框

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个流。因此,似乎嵌套循环似乎合适,但我是熊猫和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)

2 个答案:

答案 0 :(得分: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解决方案也可能适合您的数据大小(除非出现紧密循环),并且可以节省对熊猫的依赖

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 :(得分:0)

您可以通过在流量列上使用.isin()来测试ilist中的流量,而不是遍历DataFrame(效率低下,通常在使用大熊猫时应该避免)。

在您的示例中,可以像这样提取列A中的相关值:

dfc.loc[dfc['B'].isin(ilist), 'A']