Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 像在Qlik一样在熊猫身上做交叉游戏?_Python_Pandas_Qlikview_Qliksense - Fatal编程技术网

Python 像在Qlik一样在熊猫身上做交叉游戏?

Python 像在Qlik一样在熊猫身上做交叉游戏?,python,pandas,qlikview,qliksense,Python,Pandas,Qlikview,Qliksense,我有一个数据帧: df1=pd.DataFrame({ 'ID':[101,102], 'Name':['Axel','Bob'], 'US':['GrA','GrC'], 'Europe':['GrB','GrD'], 'AsiaPac':['GrZ','GrF'] }) 我想将其更改为: df2=pd.DataFrame({ 'ID':[101,101,101,102,102,

我有一个数据帧:

    df1=pd.DataFrame({
        'ID':[101,102],
        'Name':['Axel','Bob'],
        'US':['GrA','GrC'],
        'Europe':['GrB','GrD'],
        'AsiaPac':['GrZ','GrF']
     })
我想将其更改为:

    df2=pd.DataFrame({
    'ID':[101,101,101,102,102,102],
    'Name':['Axel','Axel','Axel','Bob','Bob','Bob'],
    'Region':['US','Europe','AsiaPac','US','Europe','AsiaPac'],
    'Group':['GrA','GrB','GrZ','GrC','GrD','GrF']
})
我该怎么做?pandas中有一个交叉表函数,但它不这样做。在Qlik中,我只需

    Crosstable(Region,Group,2)  
    LOAD
        ID,
        Name,
        US,
        Europe,
        AsiaPac

我会从df1到df2。在python中如何实现这一点(熊猫或其他)?

这实质上是将数据从宽格式重塑为长格式,这在R语言中是众所周知的。在pandas中,您可以使用
pd.melt

pd.melt(df1, id_vars=['ID', 'Name'], var_name='Region', value_name='Group')
#     ID  Name   Region Group
# 0  101  Axel  AsiaPac   GrZ
# 1  102   Bob  AsiaPac   GrF
# 2  101  Axel   Europe   GrB
# 3  102   Bob   Europe   GrD
# 4  101  Axel       US   GrA
# 5  102   Bob       US   GrC
如果需要按
ID
Name
Group
对列进行排序,如示例输出中所示,可以将
.sort\u values()
添加到表达式中:

pd.melt(df1, id_vars=['ID', 'Name'], var_name='Region', value_name='Group').sort_values(['ID', 'Group'])
#     ID  Name   Region Group
# 4  101  Axel       US   GrA
# 2  101  Axel   Europe   GrB
# 0  101  Axel  AsiaPac   GrZ
# 5  102   Bob       US   GrC
# 3  102   Bob   Europe   GrD
# 1  102   Bob  AsiaPac   GrF
你可以试试

第一

stack()


第二

pd.wide\u to\u long
,即使是过度杀伤力。:)


@AlhpaDelta Yw~变量名和值名之间有什么区别?
   df1.set_index(['ID','Name']).stack().reset_index().rename(columns={'level_2':'Region',0:'Group'})
Out[890]: 
    ID  Name   Region Group
0  101  Axel  AsiaPac   GrZ
1  101  Axel   Europe   GrB
2  101  Axel       US   GrA
3  102   Bob  AsiaPac   GrF
4  102   Bob   Europe   GrD
5  102   Bob       US   GrC
df1=df1.rename(columns={'AsiaPac':'Group_AsiaPac','Europe':'Group_Europe','US':'Group_US'})
pd.wide_to_long(df1,['Group'], i=['ID','Name'], j='Region',sep='_',suffix='.').reset_index()

Out[918]: 
    ID  Name   Region Group
0  101  Axel  AsiaPac   GrZ
1  101  Axel   Europe   GrB
2  101  Axel       US   GrA
3  102   Bob  AsiaPac   GrF
4  102   Bob   Europe   GrD
5  102   Bob       US   GrC