在特定位置为熊猫数据框分配值时出现问题

时间:2020-08-13 10:08:19

标签: python pandas

在将值分配给特定位置(列和索引)的数据帧时遇到问题。 首先,我创建一个空的数据框:

self.timeseries = pd.DataFrame(
                columns = ["temperature", "state_of_charge", "m_ice", "m_water"],
                index = pd.date_range(
                        start = self.environment.start,
                        end = self.environment.end,
                        freq = self.environment.time_freq,
                        name = "time"
                        )
                )

稍后,我尝试为每个索引的每一列分配值:

        self.timeseries.temperature.loc[timestamp] = self.current_temp
        self.timeseries.state_of_charge.loc[timestamp] = self.state_of_charge
        self.timeseries.m_ice.loc[timestamp] = self.m_ice /self.mass
        self.timeseries.m_water.loc[timestamp] = self.m_water / self.mass

上面代码的第一行似乎起作用。但是一旦到达第二行,我会收到以下错误消息:

ValueError: No axis named 1 for object type <class 'pandas.core.series.Series'>

在代码的其他部分中,使用完全相同的过程,并且有效。

非常感谢您提前提供的帮助!

P.S .:我不知道,是否有必要,但还有其他信息:

我在anaconda 1.9.12中使用spyder 3.3.6(Python 3.7)

2 个答案:

答案 0 :(得分:0)

import pandas as pd
timeseries = pd.DataFrame(
                columns = ["temperature", "state_of_charge", "m_ice", "m_water"],
                index =pd.date_range(start ='01-01-2018',
                         end ='01-02-2018', freq ='5H')
                )
print(timeseries)
timeseries.temperature.loc['2018-01-01 00:00:00'] = 15
timeseries.state_of_charge.loc['2018-01-01 00:00:00'] = 10
timeseries.m_ice.loc['2018-01-01 00:00:00'] = 1
timeseries.m_water.loc['2018-01-01 00:00:00'] = 1
print(timeseries)

结果:

                    temperature state_of_charge m_ice m_water
2018-01-01 00:00:00         NaN             NaN   NaN     NaN
2018-01-01 05:00:00         NaN             NaN   NaN     NaN
2018-01-01 10:00:00         NaN             NaN   NaN     NaN
2018-01-01 15:00:00         NaN             NaN   NaN     NaN
2018-01-01 20:00:00         NaN             NaN   NaN     NaN
                    temperature state_of_charge m_ice m_water
2018-01-01 00:00:00          15              10     1       1
2018-01-01 05:00:00         NaN             NaN   NaN     NaN
2018-01-01 10:00:00         NaN             NaN   NaN     NaN
2018-01-01 15:00:00         NaN             NaN   NaN     NaN
2018-01-01 20:00:00         NaN             NaN   NaN     NaN

答案 1 :(得分:0)

您可以尝试遍历数据帧的长度,并使用整数索引位置将值填充到列中。这些值可以是计算得出的值,并不重要。逻辑将保持不变。

import pandas as pd
timeseries = pd.DataFrame(
                columns = ["temperature", "state_of_charge", "m_ice", "m_water"],
                index =pd.date_range(start ='01-01-2018 00:00:00',
                         end ='01-02-2018 00:00:00', freq='0.25H')
                )

for i in range(len(timeseries)):
   # this an example, can be any calculated value or function return # 
    timeseries.temperature.iloc[i] = i 
    timeseries.state_of_charge.iloc[i] = i+1
    timeseries.m_ice.iloc[i] = i+2
    timeseries.m_water.iloc[i] = i+3
print(timeseries)

                    temperature state_of_charge m_ice m_water
2018-01-01 00:00:00           0               1     2       3
2018-01-01 00:15:00           1               2     3       4
2018-01-01 00:30:00           2               3     4       5
2018-01-01 00:45:00           3               4     5       6
2018-01-01 01:00:00           4               5     6       7
...                         ...             ...   ...     ...
2018-01-01 23:00:00          92              93    94      95
2018-01-01 23:15:00          93              94    95      96
2018-01-01 23:30:00          94              95    96      97
2018-01-01 23:45:00          95              96    97      98
2018-01-02 00:00:00          96              97    98      99