1

我目前有一个如下所示的数据框:

df.head()

df = pd.DataFrame({'browser': ['Chrome', 'Chrome', 'firefox', 'firefox', 'Safari'],
 'version': ['87', '88', '92', '93', '12'],
 'Monday': ['11am', '1pm', '1pm', '12pm', '2pm'],
 'Tuesday': ['11am', '1pm', '12pm', '10am', '2pm'],
 'Wednesday': ['12pm', '10am', '1pm', '12pm', '12pm'],
 'Thursday': ['10am', '11am', '10am', '10am', '12pm'],
 'Friday': ['2pm', '10am', '10am', '12pm', '11am'],
 'Saturday': ['11am', '12pm', '10am', '11am', '11am'],
 'Sunday': ['11am', '12pm', '11am', '12pm', '11am']})

我正在尝试旋转上述数据框,以便

  1. 该索引是一天中的 24 小时,即在列中看到的值 Monday...Sunday
  2. 列是周一到周日
  3. 要填充的值是浏览器+版本的唯一计数(假设输入 df 中的每一行在字符串连接时始终具有唯一的浏览器+版本)

最终的数据框看起来像这样(显示前 5 行,但总共有 24 行 - 每小时 1 行): final_df.head()

我尝试查看pd.pivot特别是参数索引的代码并尝试提供我的索引,但这会导致错误。例如。

index_for_new_df = ['12am'] + [f'{x}am' for x in range(1,12)] + ['12pm'] + [f'{x}pm' for x in range(1,12)]
# will generate list like [... ,'10am', '11am', '12pm', '1pm', '2pm' ,...]
pd.pivot(df,index=index_for_new_df,...)

有没有其他可以使用的功能?我试图避免编写太多嵌套FOR循环并尝试查看是否有任何可以使用的内置函数(只要大部分处理由 pandas 完成,For 循环就可以了)。有没有其他功能可以尝试?

4

1 回答 1

2

melt然后尝试pivot_table

(df.melt(['browser','version'], value_name='hour', var_name='day')
   .pivot_table(index='hour', columns='day', values='browser', 
                aggfunc='size', fill_value=0)
)

输出:

day   Friday  Monday  Saturday  Sunday  Thursday  Tuesday  Wednesday
hour                                                                
10am       2       0         1       0         3        1          1
11am       1       1         3       3         1        1          0
12pm       1       1         1       2         1        1          3
1pm        0       2         0       0         0        1          1
2pm        1       1         0       0         0        1          0
于 2021-01-27T02:54:24.850 回答