[英]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.