我有一个数据框
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)
答案 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']