簡體   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