繁体   English   中英

Pandas:创建 Pivot 表时出现类型错误

[英]Pandas: type error when creating a Pivot Table

我有一个最低限度的可重现数据集(从内部数据库中检索),如下所示:

import pandas as pd

df = pd.DataFrame({'manufacturer':['BMW', 'Mercedes', 'Mercedes', 'Audi'],
                  'created_time':['2021-03-05T07:18:12.281-0600', '2021-03-04T15:34:23.373-0600', '2021-03-01T04:57:47.848-0600', '2021-02-25T09:31:37.341-0600'],
                  'action_time':['2021-03-05T08:32:19.153-0600', '2021-03-04T15:37:32.360-0600', '2021-03-01T08:37:39.083-0600', '2021-02-25T09:58:12.425-0600']})

df
    manufacturer    created_time                    action_time
0   BMW             2021-03-05T07:18:12.281-0600    2021-03-05T08:32:19.153-0600
1   Mercedes        2021-03-04T15:34:23.373-0600    2021-03-04T15:37:32.360-0600
2   Mercedes        2021-03-01T04:57:47.848-0600    2021-03-01T08:37:39.083-0600
3   Audi            2021-02-25T09:31:37.341-0600    2021-02-25T09:58:12.425-0600

然后我创建一个名为elapsed_time的自定义列:

df['created_time'] = pd.to_datetime(df['created_time'])
df['action_time'] = pd.to_datetime(df['action_time'])
time_threshold = pd.to_datetime('08:30').time()

df['created_time_adjusted']=df['created_time'].apply(lambda x:
                                                  x.replace(hour=8,minute=30,second=0)
                                                  if x.time()<time_threshold else x)

df['elapsed_time'] = (df['action_time'] - df['created_time_adjusted']).dt.total_seconds() /60

更新后的 dataframe 如下所示:

column_headers = ['manufacturer', 'created_time', 'action_time', 'created_time_adjusted', 'elapsed_time']
df = df.reindex(columns=column_headers)
df

    manufacturer   created_time                        action_time                        created_time_adjusted             elapsed_time
0   BMW            2021-03-05 07:18:12.281000-06:00    2021-03-05 08:32:19.153000-06:00   2021-03-05 08:30:00.281000-06:00  2.314533
1   Mercedes       2021-03-04 15:34:23.373000-06:00    2021-03-04 15:37:32.360000-06:00   2021-03-04 15:34:23.373000-06:00  3.149783
2   Mercedes       2021-03-01 04:57:47.848000-06:00    2021-03-01 08:37:39.083000-06:00   2021-03-01 08:30:00.848000-06:00  7.637250
3   Audi           2021-02-25 09:31:37.341000-06:00    2021-02-25 09:58:12.425000-06:00   2021-02-25 09:31:37.341000-06:00  26.584733

到目前为止,一切都很好。

类型如下所示:

df.dtypes
manufacturer                                             object
created_time             datetime64[ns, pytz.FixedOffset(-360)]
action_time              datetime64[ns, pytz.FixedOffset(-360)]
created_time_adjusted    datetime64[ns, pytz.FixedOffset(-360)]
elapsed_time                                            float64
dtype: object

最后,我尝试使用 pivot 的数据来查看manufacturer的平均elapsed_time 我这样做如下:

pivoted_data = pd.pivot_table(data=df, index='manufacturer', values='elapsed_time', aggfunc=np.mean)

其中,在这个玩具数据集上,给出:

pivoted_data

    elapsed_time
manufacturer    
Audi        26.584733
BMW         2.314533
Mercedes    5.393517

但是,当我在生产数据集上运行它时(重申一下,它具有相同的数据类型),我看到以下错误:

TypeError:  '<' not supported between instances of 'CustomFieldOption' and 'CustomFieldOption'

该错误表明这是类型的问题。 但是,当玩具数据集和生产数据集之间的类型匹配时,我不明白这会如何。

有谁知道这里出了什么问题或者我该如何进一步调试?

谢谢!

################################################# ##################

更新:

在遵循@Icarwiz 的建议后,我挖得更深一点,并在manufacturer上调用了以下内容:

df['manufacturer].unique()

这导致:

array([<DB CustomFieldOption:  value='BMW', id='32563'>,
       <DB CustomFieldOption:  value='Mercedes', id='32431'>,
       <DB CustomFieldOption:  value='Mercedes', id='32431'>,
       <DB CustomFieldOption:  value='Audi', id='28371'>],
      dtype=object)

所以,这是一个复杂的数据类型。 知道从这里到 go 的位置吗?

您说“相同的数据类型”,但考虑到制造商是object ,它不能证明任何事情,因为它可以是从简单的str到非常复杂的对象的任何东西。

在这里,您的列制造商中似乎有一些不是字符串的东西......

试试这个来找到它们:

df[df['manufacturer'].map(lambda x: type(x) is not str)]

编辑:

好的,这就是答案... :)

现在您只需要使用我不知道的这种 object 进行管理...有根据的猜测,请尝试使用以下内容将您的列转换为 str :

df['manufacturer'] = df['manufacturer'].map(lambda x: x.value)

但如果它不起作用,你将不得不学习这种 object 是如何工作的......

test_obj = df['manufacturer'].iloc[0]
print(dir(test_obj))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM