如何在Python中重塑数据?

2024-04-28 14:08:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集如下-

Timestamp = 22-05-2019 08:40 :Light = 64.00 :Temp_Soil = 20.5625 :Temp_Air = 23.1875 :Soil_Moisture_1 = 756 :Soil_Moisture_2 = 780 :Soil_Moisture_3 = 1002

Timestamp = 22-05-2019 08:42 :Light = 64.00 :Temp_Soil = 20.5625 :Temp_Air = 23.125 :Soil_Moisture_1 = 755 :Soil_Moisture_2 = 782 :Soil_Moisture_3 = 1002

我想重塑(重新排列)数据集,使标题列的方向像[时间戳,灯光,温度土壤,温度空气,土壤水分1,土壤水分2,土壤水分3]和它们的值作为Python中的行条目。在


Tags: 数据标题时间air温度方向temptimestamp
1条回答
网友
1楼 · 发布于 2024-04-28 14:08:46

可能的解决方案之一:

我没有使用“true”输入文件,而是使用了一个字符串:

inp="""Timestamp = 22-05-2019 08:40 :Light = 64.00 :TempSoil = 20.5625 :TempAir = 23.1875 :SoilMoist1 = 756 :SoilMoist2 = 780 :SoilMoist3 = 1002
Timestamp = 22-05-2019 08:42 :Light = 64.00 :TempSoil = 20.5625 :TempAir = 23.125 :SoilMoist1 = 755 :SoilMoist2 = 782 :SoilMoist3 = 1002"""
buf = pd.compat.StringIO(inp)

为了避免输出行的“折叠”,我缩短了字段名。在

然后,让我们创建结果DataFrame和要附加到它的“行”列表。 现在-他们两个都是空的。在

^{pr2}$

下面是处理输入行的循环:

while True:
    line = buf.readline()
    if not(line):    # EOF
        break
    lst = re.split(r' :', line.rstrip())  # Field list
    if len(lst) < 2: # Skip empty source lines
        continue
    dct = {}         # Source "row" (dictionary)
    for elem in lst: # Process fields
        k, v = re.split(r' = ', elem)
        dct[k] = v   # Add field : value to "row"
    src.append(dct)

最后一步是将行从src追加到df

df = df.append(src, ignore_index =True, sort=False)

当您打印(df)时,对于我的测试数据,您将得到:

          Timestamp  Light TempSoil  TempAir SoilMoist1 SoilMoist2 SoilMoist3
0  22-05-2019 08:40  64.00  20.5625  23.1875        756        780       1002
1  22-05-2019 08:42  64.00  20.5625   23.125        755        782       1002

现在所有的列都是string类型,因此您可以更改所需的 列到floatint

df.Light = pd.to_numeric(df.Light)
df.TempSoil = pd.to_numeric(df.TempSoil)
df.TempAir = pd.to_numeric(df.TempAir)
df.SoilMoist1 = pd.to_numeric(df.SoilMoist1)
df.SoilMoist2 = pd.to_numeric(df.SoilMoist2)
df.SoilMoist3 = pd.to_numeric(df.SoilMoist3)

注意to_numeric()函数足够聪明,可以识别 要转换为的类型,因此前3列将其类型更改为float64 接下来的3到int64。在

您可以检查它正在执行df.info()。在

另一个可能的转换是更改时间戳列 收件人日期时间键入:

df.Timestamp = pd.to_datetime(df.Timestamp)

相关问题 更多 >