"; 只有 pd.Series、pd.DataFrame 和 pd.Panel(已弃用)obj 有效,python"/>

首页 > 解决方案 > 无法连接类型为“的对象”"; 只有 pd.Series、pd.DataFrame 和 pd.Panel(已弃用)obj 有效

问题描述

我这里有 df2,它是从 1 月 1 日到 8 月 26 日的一系列值。我创建了一个新的数据框,定义了列、春夏和秋季。我想将每个季节的每个日期范围内的值移动到新数据框中的适当列中。我收到此错误,不确定下一步该去哪里。有人有想法么?

'print(df2)
seasons = (pd.DataFrame(columns = ['Winter','Spring','Summer', 'Autumn']))
Sp = df2[pd.date_range(start = '01/01/2020', end = '28/02/2020')]
for value in Sp:
    if value >0:
        seasons['Winter'].append(value)'

标签: python

解决方案


一般来说,在 pandas 中构建 DataFrame 时,最好将数据收集到本机集合(列表、字典、元组)中,然后最后将它们转换为 DataFrame。将单元格或行逐位添加到 DataFrame 很慢。

您在这里遇到的具体错误是 append 仅适用于组合 pandas 对象。

您可以使用.locassignment 来做您所描述的事情,但不建议这样做:

for i, value in enumerate(Sp.values):
    seasons.loc[i, 'Winter'] = value

但是您提取值的方式让我认为新表在这里没有最有意义。

最好向 df2 添加一个名为 Season 的新列,根据日期将每一行标记为 Winter、Summer 等。然后你可以使用groupby('Season')query('Season == "Winter"')逐季提取数据。

要创建 Season 列,您只需要一个函数来告诉您一行所在的季节。我不知道您的表中有什么,而且我对 datetime 对象不太擅长,但它会采用这种形式:

def assign_season(index):
    season = ...
    return season

然后,您使用以下内容创建列:

df2['Season'] = [assign_season(x) for x in df.index]

不必使用索引,可以使用列,但形式基本相同。只需确保该函数是为您传递给它的内容而设计的。您还可以关闭多个列值:

def assign_season(val1, val2):
    ...

df2['Season'] = [assign_season(*vals) 
                 for vals in df2[['Column1', 'Column2']].values] 

推荐阅读