分组还是合并?python中的数据帧

分组还是合并?python中的数据帧,python,merge,pandas,grouping,Python,Merge,Pandas,Grouping,另一个关于大熊猫的分类问题。目前,我正在使用以下代码中的merge函数和stack函数对它们进行分组: import pandas as pd, numpy as np df = pd.DataFrame({'Type' : ['SS', 'SS', 'SS', 'DD', 'DD', 'FF'], 'No.' : ['323', '12', '21', '334', '44', '55'], 'Res' : ['O', 'E'

另一个关于大熊猫的分类问题。目前,我正在使用以下代码中的merge函数和stack函数对它们进行分组:

import pandas as pd, numpy as np


df = pd.DataFrame({'Type' : ['SS', 'SS', 'SS', 'DD', 'DD', 'FF'],
                'No.' : ['323', '12', '21', '334', '44', '55'],
                'Res' : ['O', 'E', 'O', 'E', 'E', 'O']}).set_index('Type')
df2 = pd.DataFrame({'Type' : ['SS', 'SS', 'TT', 'DD', 'FF'],
                'No.' : ['43', '77', '98', '352', '51'],
                'Res' : ['O', 'O', 'E', 'E', 'O']}).set_index('Type')
Merged=concat([df,df2], axis=0, keys=['Sample1','Sample2']).stack()

print Merged

有没有一种方法可以分组,这样我可以得到与以下方法类似的结果:

      Sample1  Sample 2
      No. Res  No.  Res
Type         
SS    323   O   43   O
       12   E   77   O
       21   O
DD    334   E  352   E
       44   E
FF     55   O   51   O
TT              98   E

您需要一个列多索引,以便以所需的格式获取数据:

import pandas as pd, numpy as np

df = pd.DataFrame({'Type' : ['SS1', 'SS2', 'SS3', 'DD1', 'DD2', 'FF1'],
                'No.' : ['323', '12', '21', '334', '44', '55'],
                'Res' : ['O', 'E', 'O', 'E', 'E', 'O']}).set_index('Type')
df2 = pd.DataFrame({'Type' : ['SS1', 'SS2', 'TT1', 'DD1', 'FF1'],
                'No.' : ['43', '77', '98', '352', '51'],
                'Res' : ['O', 'O', 'E', 'E', 'O']}).set_index('Type')


#Add multi index to the two dataframes
df.columns = [["Season 1"]*2, list(df.columns)]

df2.columns =  [["Season 2"]*2, list(df2.columns)]

#Join on their row index
df.join(df2)

您需要一个列多索引,以便以所需的格式获取数据:

import pandas as pd, numpy as np

df = pd.DataFrame({'Type' : ['SS1', 'SS2', 'SS3', 'DD1', 'DD2', 'FF1'],
                'No.' : ['323', '12', '21', '334', '44', '55'],
                'Res' : ['O', 'E', 'O', 'E', 'E', 'O']}).set_index('Type')
df2 = pd.DataFrame({'Type' : ['SS1', 'SS2', 'TT1', 'DD1', 'FF1'],
                'No.' : ['43', '77', '98', '352', '51'],
                'Res' : ['O', 'O', 'E', 'E', 'O']}).set_index('Type')


#Add multi index to the two dataframes
df.columns = [["Season 1"]*2, list(df.columns)]

df2.columns =  [["Season 2"]*2, list(df2.columns)]

#Join on their row index
df.join(df2)

您需要一个列多索引,以便以所需的格式获取数据:

import pandas as pd, numpy as np

df = pd.DataFrame({'Type' : ['SS1', 'SS2', 'SS3', 'DD1', 'DD2', 'FF1'],
                'No.' : ['323', '12', '21', '334', '44', '55'],
                'Res' : ['O', 'E', 'O', 'E', 'E', 'O']}).set_index('Type')
df2 = pd.DataFrame({'Type' : ['SS1', 'SS2', 'TT1', 'DD1', 'FF1'],
                'No.' : ['43', '77', '98', '352', '51'],
                'Res' : ['O', 'O', 'E', 'E', 'O']}).set_index('Type')


#Add multi index to the two dataframes
df.columns = [["Season 1"]*2, list(df.columns)]

df2.columns =  [["Season 2"]*2, list(df2.columns)]

#Join on their row index
df.join(df2)

您需要一个列多索引,以便以所需的格式获取数据:

import pandas as pd, numpy as np

df = pd.DataFrame({'Type' : ['SS1', 'SS2', 'SS3', 'DD1', 'DD2', 'FF1'],
                'No.' : ['323', '12', '21', '334', '44', '55'],
                'Res' : ['O', 'E', 'O', 'E', 'E', 'O']}).set_index('Type')
df2 = pd.DataFrame({'Type' : ['SS1', 'SS2', 'TT1', 'DD1', 'FF1'],
                'No.' : ['43', '77', '98', '352', '51'],
                'Res' : ['O', 'O', 'E', 'E', 'O']}).set_index('Type')


#Add multi index to the two dataframes
df.columns = [["Season 1"]*2, list(df.columns)]

df2.columns =  [["Season 2"]*2, list(df2.columns)]

#Join on their row index
df.join(df2)

您尝试的几乎是正确的,您只需要在
concat
中使用
axis=1
(并且没有堆栈)。但是数据帧的问题是您有一个非唯一索引,因此
concat
无法知道如何沿该轴连接两个数据帧(例如有多个“SS”)。
一种方法是,例如在索引中添加第二个级别以使其唯一(这仅适用于pandas 0.13,有关旧版本的解决方法,请参见下文):

因此,数据帧看起来像:

In [64]: df
Out[64]:
            No. Res
Type count
SS   0      323   O
     1       12   E
     2       21   O
DD   0      334   E
     1       44   E
FF   0       55   O
然后您可以使用
axis=1
和您提供的
键来连接这两个:

In [65]: pd.concat([df,df2], axis=1, keys=['Sample1','Sample2'])
Out[65]:
           Sample1      Sample2
               No.  Res     No.  Res
Type count
DD   0         334    E     352    E
     1          44    E     NaN  NaN
FF   0          55    O      51    O
SS   0         323    O      43    O
     1          12    E      77    O
     2          21    O     NaN  NaN
TT   0         NaN  NaN      98    E
您始终可以使用
merged.index=merged.index.droplevel(1)
再次删除
计数

但是,当然,这是否是一个好的解决方案取决于您的数据的性质以及您想进一步使用它做什么


注意:
cumcount
是一种仅在master中可用的新方法(最快于0.13发布),目前您可以通过以下方式实现相同的效果:

df = df.reset_index()
df['count'] = df.groupby('Type').apply(lambda x : pd.Series(np.arange(len(x)), x.index))
df.set_index(['Type', 'count'])

您尝试的几乎是正确的,您只需要在
concat
中使用
axis=1
(并且没有堆栈)。但是数据帧的问题是您有一个非唯一索引,因此
concat
无法知道如何沿该轴连接两个数据帧(例如有多个“SS”)。
一种方法是,例如在索引中添加第二个级别以使其唯一(这仅适用于pandas 0.13,有关旧版本的解决方法,请参见下文):

因此,数据帧看起来像:

In [64]: df
Out[64]:
            No. Res
Type count
SS   0      323   O
     1       12   E
     2       21   O
DD   0      334   E
     1       44   E
FF   0       55   O
然后您可以使用
axis=1
和您提供的
键来连接这两个:

In [65]: pd.concat([df,df2], axis=1, keys=['Sample1','Sample2'])
Out[65]:
           Sample1      Sample2
               No.  Res     No.  Res
Type count
DD   0         334    E     352    E
     1          44    E     NaN  NaN
FF   0          55    O      51    O
SS   0         323    O      43    O
     1          12    E      77    O
     2          21    O     NaN  NaN
TT   0         NaN  NaN      98    E
您始终可以使用
merged.index=merged.index.droplevel(1)
再次删除
计数

但是,当然,这是否是一个好的解决方案取决于您的数据的性质以及您想进一步使用它做什么


注意:
cumcount
是一种仅在master中可用的新方法(最快于0.13发布),目前您可以通过以下方式实现相同的效果:

df = df.reset_index()
df['count'] = df.groupby('Type').apply(lambda x : pd.Series(np.arange(len(x)), x.index))
df.set_index(['Type', 'count'])

您尝试的几乎是正确的,您只需要在
concat
中使用
axis=1
(并且没有堆栈)。但是数据帧的问题是您有一个非唯一索引,因此
concat
无法知道如何沿该轴连接两个数据帧(例如有多个“SS”)。
一种方法是,例如在索引中添加第二个级别以使其唯一(这仅适用于pandas 0.13,有关旧版本的解决方法,请参见下文):

因此,数据帧看起来像:

In [64]: df
Out[64]:
            No. Res
Type count
SS   0      323   O
     1       12   E
     2       21   O
DD   0      334   E
     1       44   E
FF   0       55   O
然后您可以使用
axis=1
和您提供的
键来连接这两个:

In [65]: pd.concat([df,df2], axis=1, keys=['Sample1','Sample2'])
Out[65]:
           Sample1      Sample2
               No.  Res     No.  Res
Type count
DD   0         334    E     352    E
     1          44    E     NaN  NaN
FF   0          55    O      51    O
SS   0         323    O      43    O
     1          12    E      77    O
     2          21    O     NaN  NaN
TT   0         NaN  NaN      98    E
您始终可以使用
merged.index=merged.index.droplevel(1)
再次删除
计数

但是,当然,这是否是一个好的解决方案取决于您的数据的性质以及您想进一步使用它做什么


注意:
cumcount
是一种仅在master中可用的新方法(最快于0.13发布),目前您可以通过以下方式实现相同的效果:

df = df.reset_index()
df['count'] = df.groupby('Type').apply(lambda x : pd.Series(np.arange(len(x)), x.index))
df.set_index(['Type', 'count'])

您尝试的几乎是正确的,您只需要在
concat
中使用
axis=1
(并且没有堆栈)。但是数据帧的问题是您有一个非唯一索引,因此
concat
无法知道如何沿该轴连接两个数据帧(例如有多个“SS”)。
一种方法是,例如在索引中添加第二个级别以使其唯一(这仅适用于pandas 0.13,有关旧版本的解决方法,请参见下文):

因此,数据帧看起来像:

In [64]: df
Out[64]:
            No. Res
Type count
SS   0      323   O
     1       12   E
     2       21   O
DD   0      334   E
     1       44   E
FF   0       55   O
然后您可以使用
axis=1
和您提供的
键来连接这两个:

In [65]: pd.concat([df,df2], axis=1, keys=['Sample1','Sample2'])
Out[65]:
           Sample1      Sample2
               No.  Res     No.  Res
Type count
DD   0         334    E     352    E
     1          44    E     NaN  NaN
FF   0          55    O      51    O
SS   0         323    O      43    O
     1          12    E      77    O
     2          21    O     NaN  NaN
TT   0         NaN  NaN      98    E
您始终可以使用
merged.index=merged.index.droplevel(1)
再次删除
计数

但是,当然,这是否是一个好的解决方案取决于您的数据的性质以及您想进一步使用它做什么


注意:
cumcount
是一种仅在master中可用的新方法(最快于0.13发布),目前您可以通过以下方式实现相同的效果:

df = df.reset_index()
df['count'] = df.groupby('Type').apply(lambda x : pd.Series(np.arange(len(x)), x.index))
df.set_index(['Type', 'count'])

你从哪里得到concat?你从哪里得到concat?你从哪里得到concat?你从哪里得到concat?join的问题是,由于非唯一索引,你最终会得到重复的行。是的,我不得不向类型索引添加数字以使其工作,这不是很优雅。另一方面,它允许您控制一个类型中的哪些记录对齐一行。啊,是的,我没有看到。这有点类似于我所做的,添加一列这些数字,而不是标签本身。一旦你有了一个唯一的索引(使用我的或你的方法),两种方法(我的或你的)都会产生相同的结果。join的问题是,由于非唯一索引,你最终会得到重复的行。是的,我不得不向类型索引添加数字以使其工作,这不是很优雅。另一方面,它允许您控制一个类型中的哪些记录对齐一行。啊,是的,我没有看到。这有点类似于我所做的,添加一列这些数字,而不是标签本身。一旦你有了一个唯一的索引(我的或你的方法),两种方法(我的或你的)都会产生相同的结果