【问题标题】:How do i combine the results from a while loop winto one output?如何将 while 循环的结果合并到一个输出中?
【发布时间】:2022-01-20 13:52:20
【问题描述】:

我想从while 循环中取出一张桌子,而不是多张桌子。我试图合并数据框,但这只给出了多个包含 2 行的表,而不是 1 个包含所有数据的大表。 while 循环用于从每个传感器获取数据,这些数据需要显示在一个表中。

我尝试以不同的方式合并数据,例如df.merge,还使用其他语句来获取数据,例如 if/else 和 for 语句。我最接近想要的结果是使用 while 语句并通过 pd.concat 组合结果。这给了我 2 行的表格,但不是包含所有结果的想要的表格。

两个数据框中的维度相同。数据框是使用这个制作的:

d = {
    "name": [loc_name], 
    "onder(<"+ str(CO2_low)+ "ppm)": [lessperc], 
    "tussen("+str(CO2_low)+"-"+str(CO2_high)+"ppm)": [betweenperc], 
    "boven(>"+ str(CO2_high)+"ppm)": [moreperc]
}

创建数据帧之前的虚拟数据,所以这在我的代码中是 d:

{'name': ['1.04'], 'onder(<950ppm)': [1.0], 'tussen(950-1100ppm)': [0.0], 'boven(>1100ppm)': [0.0]}
{'name': ['1.05'], 'onder(<950ppm)': [0.98], 'tussen(950-1100ppm)': [0.2], 'boven(>1100ppm)': [0.0]}
{'name': ['1.06'], 'onder(<950ppm)': [0.93], 'tussen(950-1100ppm)': [0.4], 'boven(>1100ppm)': [0.3]}

以下是想要的结果的示例:

Name <950 950-1100 >1100
1.04 1.0 0.0 0.0
1.05 0.98 0.2 0.0
1.06 0.93 0.4 0.3

我目前使用的代码:

#Create the dataframe
while(k==0):
    k = k + 1
#d is used to get the data from the sensors
    d = (sensordata)
    df1 = pd.DataFrame(data=d)

#Add rows for the next sensor/location
else:
    d = (sensordata)
    df2 = pd.DataFrame(data=d)

frames = [df1, df2]
result = pd.concat(frames)
print(result)

【问题讨论】:

  • df1df2 有哪些维度?索引/列是否相同?您能否添加一些虚拟数据以便我们重现该问题?
  • 只需在循环前初始化一个列表,将列表与循环中的每个数据帧一起附加,然后在循环外的列表上运行pd.concat

标签: python pandas dataframe while-loop


【解决方案1】:

为了说明我做了一个 for 循环,因为提供的代码示例是有限的。正如@Parfait 所说,您可能想要做的是在循环之前初始化一个变量。

这可能是您填写的列表,稍后创建一个数据框。或者您可以直接将每个 d 值附加到数据框。这里的用例不是很清楚,但在我看来,您想立即为每个新 d 更新。

希望这个例子能有所帮助:

d_values = [
{'name': ['1.04'], 'onder(<950ppm)': [1.0], 'tussen(950-1100ppm)': [0.0], 'boven(>1100ppm)': [0.0]},
{'name': ['1.05'], 'onder(<950ppm)': [0.98], 'tussen(950-1100ppm)': [0.2], 'boven(>1100ppm)': [0.0]},
{'name': ['1.06'], 'onder(<950ppm)': [0.93], 'tussen(950-1100ppm)': [0.4], 'boven(>1100ppm)': [0.3]}
]

result = None
for d in d_values:
    if result is None:
        result = pd.DataFrame(data=d)
    else:
        df2 = pd.DataFrame(data=d)
        result = pd.concat([result,df2], ignore_index=True)

现在您将对位于循环之外的结果 Dataframe 执行 concat。

您可能只收到 2 个结果的原因是因为在下一次运行中您没有使用结果更新,而是再次使用 df1 和 df2。

输出

   name  onder(<950ppm)  tussen(950-1100ppm)  boven(>1100ppm)
0  1.04            1.00                  0.0              0.0
1  1.05            0.98                  0.2              0.0
2  1.06            0.93                  0.4              0.3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-29
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多