Python 如何将多索引数据透视表转换为包含部分索引的嵌套列表?

Python 如何将多索引数据透视表转换为包含部分索引的嵌套列表?,python,pandas,dataframe,numpy-ndarray,multi-index,Python,Pandas,Dataframe,Numpy Ndarray,Multi Index,更新:我真的试过让我的示例代表参加,结果却没有。我更新了这个问题,因为精神是一样的,只是有点复杂 我正在使用一个大熊猫数据集,我想从中提取数据进行绘图。这个小例子应该说明这一点: 将熊猫作为pd导入 df=pd.DataFrame({'Name':pd.category(['Carl','Carl','Carl','Carl','Tina','Tina','Tina',', “卡尔”、“卡尔”、“蒂娜”、“蒂娜”、“卡尔”、“卡尔”]*2), “DayOfYear:[51,20,20,1,70

更新:我真的试过让我的示例代表参加,结果却没有。我更新了这个问题,因为精神是一样的,只是有点复杂


我正在使用一个大熊猫数据集,我想从中提取数据进行绘图。这个小例子应该说明这一点:

将熊猫作为pd导入
df=pd.DataFrame({'Name':pd.category(['Carl','Carl','Carl','Carl','Tina','Tina','Tina',',
“卡尔”、“卡尔”、“蒂娜”、“蒂娜”、“卡尔”、“卡尔”]*2),
“DayOfYear:[51,20,20,1,70,140,77,190,210,365,260,333]*2,
“类型”:pd.分类(['Weight']*12+['Height']*12),
‘数字’:[60.3,61.0,59.8,77.1,74.0,73.4,58.2,60.6,73.6,75.0,59.7,60.5,
172.3, 172.3, 172.3, 165.9, 165.9, 165.9,
172.3, 172.3, 165.9, 165.9, 172.3, 172.3],
})
我从分组开始,但改为透视表,因为工作流似乎更简单,应该是一样的,对吗?我尝试了很多东西,到目前为止,这让我离目标最近:

p=pd.pivot_表(df,索引=['Name','DayOfYear',值='Number',列='Type')

对于打印,其余部分将转换为:

bqplot\u需要什么\ux=[
[20, 51, 77, 190, 260, 333],
[1, 70, 140, 210, 365],
[20, 51, 77, 190, 260, 333],
[1, 70, 140, 210, 365],
]
需要什么样的绘图[
[60.4, 60.3, 58.2, 60.6, 59.7, 60.5],
[77.1, 74.0, 73.4, 73.6, 75.0],
[172.3] * 6,
[165.9] * 5,
]
我似乎不太理解熊猫的故事,我真的很想了解如何通过按摩
数据帧来达到目的

它不必是列表列表,也可以是
ndarray
数组


我尝试了适应,但第一个
.reset\u索引(级别=1)
已经崩溃,原因是:

TypeError: cannot insert an item into a CategoricalIndex that is not already an existing category
如果使用的
Weight
值是重复值(如前两行),则为聚合值:

然后与中的聚合列表一起使用:

最后将输出转换为列表:

what_i_want_x = df1['DayOfYear'].tolist()
what_i_want_y = df1['Weight'].tolist()

print (what_i_want_x)
[[20, 51, 77, 190, 260, 333], [1, 70, 140, 210, 365]]

print (what_i_want_y)
[[60.4, 60.3, 58.2, 60.6, 59.7, 60.5], [77.1, 74.0, 73.4, 73.6, 75.0]]
编辑:


jezrael的速度更快,但这里您可以使用pandas
。groupby

import pandas as pd
import numpy as np

df = pd.DataFrame({'Name': pd.Categorical(['Carl', 'Carl', 'Carl', 'Tina', 'Tina', 'Tina',
                                           'Carl', 'Carl', 'Tina', 'Tina', 'Carl', 'Carl']),
                   'DayOfYear': [20, 20, 51, 1, 70, 140, 77, 190, 210, 365, 260, 333],
                   'Weight': [61.0, 59.8, 60.3, 77.1, 74.0, 73.4, 58.2, 60.6, 73.6, 75.0, 59.7, 60.5]
                  })

df2 = df.groupby(["Name", "DayOfYear"]).mean().dropna().reset_index()
what_i_want_x = [list(df2["DayOfYear"][df2["Name"] == name_selected]) for name_selected in np.unique(df2["Name"])]

print(what_i_want_x)
[[20, 51, 77, 190, 260, 333], [1, 70, 140, 210, 365]]

what_i_want_y = [list(df2["Weight"][df2["Name"] == name_selected]) for name_selected in np.unique(df2["Name"])]

print(what_i_want_y )
[[60.4, 60.3, 58.2, 60.6, 59.7, 60.5], [77.1, 74.0, 73.4, 73.6, 75.0]]

对不起,我把输出搞错了。我不想让333掉下来。我根据我的期望编辑了这个问题。您的输出不正确。@primfaktor-那么它就更简单了,答案被编辑了。这是一种修复它的方法,尽管我觉得它有点不对劲。难道没有办法将它提取到一个新的“维度”?@primfaktor-问题是您不能像
np.one((3,4))那样重塑。重塑(3,2,2)
-熊猫到3d numpy数组,因为列表的长度不同。最后一段中出现错误的问题可以通过在数据透视后将列名转换为字符串来解决,答案已编辑。Works。但这不是重新做了很多
pivot\u table
/
groupby
已经做过的计算吗?我在这个解决方案中不使用
pivot\u table
。关于计算,我们首先执行
groupby
,然后只通过索引。这是一个解决方法,我很确定可以像您尝试的那样使用
level
(除非这是一个bug/feature),但我现在没有看到它。我知道,但是
pivot\u table
groupby
应该是等效的。
what_i_want_x = df1['DayOfYear'].tolist()
what_i_want_y = df1['Weight'].tolist()

print (what_i_want_x)
[[20, 51, 77, 190, 260, 333], [1, 70, 140, 210, 365]]

print (what_i_want_y)
[[60.4, 60.3, 58.2, 60.6, 59.7, 60.5], [77.1, 74.0, 73.4, 73.6, 75.0]]
p = pd.pivot_table(df, index=['Name', 'DayOfYear'], values='Number', columns='Type')
print (p)
Type            Height  Weight
Name DayOfYear                
Carl 20          172.3    60.4
     51          172.3    60.3
     77          172.3    58.2
     190         172.3    60.6
     260         172.3    59.7
     333         172.3    60.5
Tina 1           165.9    77.1
     70          165.9    74.0
     140         165.9    73.4
     210         165.9    73.6
     365         165.9    75.0
     
df1 = p.rename(columns=str).reset_index(level=1).groupby(level=0).agg(list)
print (df1)
Type                    DayOfYear                                      Height  \
Name                                                                            
Carl  [20, 51, 77, 190, 260, 333]  [172.3, 172.3, 172.3, 172.3, 172.3, 172.3]   
Tina       [1, 70, 140, 210, 365]         [165.9, 165.9, 165.9, 165.9, 165.9]   

Type                                Weight  
Name                                        
Carl  [60.4, 60.3, 58.2, 60.6, 59.7, 60.5]  
Tina        [77.1, 74.0, 73.4, 73.6, 75.0]  
import pandas as pd
import numpy as np

df = pd.DataFrame({'Name': pd.Categorical(['Carl', 'Carl', 'Carl', 'Tina', 'Tina', 'Tina',
                                           'Carl', 'Carl', 'Tina', 'Tina', 'Carl', 'Carl']),
                   'DayOfYear': [20, 20, 51, 1, 70, 140, 77, 190, 210, 365, 260, 333],
                   'Weight': [61.0, 59.8, 60.3, 77.1, 74.0, 73.4, 58.2, 60.6, 73.6, 75.0, 59.7, 60.5]
                  })

df2 = df.groupby(["Name", "DayOfYear"]).mean().dropna().reset_index()
what_i_want_x = [list(df2["DayOfYear"][df2["Name"] == name_selected]) for name_selected in np.unique(df2["Name"])]

print(what_i_want_x)
[[20, 51, 77, 190, 260, 333], [1, 70, 140, 210, 365]]

what_i_want_y = [list(df2["Weight"][df2["Name"] == name_selected]) for name_selected in np.unique(df2["Name"])]

print(what_i_want_y )
[[60.4, 60.3, 58.2, 60.6, 59.7, 60.5], [77.1, 74.0, 73.4, 73.6, 75.0]]