Python 2.7 如何解除熊猫数据帧的融合

Python 2.7 如何解除熊猫数据帧的融合,python-2.7,pandas,Python 2.7,Pandas,我有一个如下的数据框,我想在这里保留一个最好的评级列 原始数据帧: skunumber category overallrating rating reviews 123 Cat1 1 1 20 124 cat1 2 2 23 skunumber category attribute attributeRawValue

我有一个如下的数据框,我想在这里保留一个最好的评级列

原始数据帧:

skunumber   category    overallrating   rating  reviews
123          Cat1          1             1        20
124          cat1          2             2        23
skunumber   category    attribute   attributeRawValue
123         Cat1      overallrating        1
124         cat1      overallrating        3
123         Cat1        rating             1
124         cat1        rating             2
123         Cat1        reviews            20
124         cat1        reviews            23
为此,我将融化数据帧,并将overallrating重命名为rating。最后删除重复项(如果有),我想再次转换熔化的数据帧原始格式

融化的数据帧如下所示:

skunumber   category    overallrating   rating  reviews
123          Cat1          1             1        20
124          cat1          2             2        23
skunumber   category    attribute   attributeRawValue
123         Cat1      overallrating        1
124         cat1      overallrating        3
123         Cat1        rating             1
124         cat1        rating             2
123         Cat1        reviews            20
124         cat1        reviews            23
DataFrame在将overallrating重命名为rating并删除重复项后看起来像

skunumber   category    attribute   attributeRawValue
123         Cat1        rating             1
124         cat1        rating             2
123         Cat1        reviews            20
124         cat1        reviews            23
最后,我希望数据帧恢复为原始帧

skunumber   category    rating  reviews
123          Cat1         1       20
124          cat1         2        23
我尝试使用pivot选项执行此操作,如果我们有一个索引列,则此操作有效,但这里我有两列

示例代码:

messy = pd.DataFrame({'row' : ['A', 'B', 'C'], 
                  'a' : [1, 2, 3],
                  'b' : [4, 5, 6],
                  'c' : [7, 8, 9]})

tidy = pd.melt(messy, id_vars='row',     var_name='dimension',value_name='length')  

messy1 = tidy.pivot(index='row',columns='dimension',values='length')   

messy1.reset_index(inplace=True)
messy1.columns.name = '' 
在我的例子中,我试图将索引作为['skunumber','category']传递,但它不起作用


谢谢

我认为您需要在以下位置的参数
id\u vars
中添加另一列:

另一个更简单的解决方案是(默认情况下只保留
第一个
值)和最后一个:

如果使用真实数据,您可以轻松获得:

ValueError:索引包含重复的条目,无法重塑

然后,解决方案如下或另一个答案:

df = pd.DataFrame({'category': ['Cat1', 'Cat1', 'cat1'],
                   'overallrating': [1, 5, 3], 
                   'skunumber': [123, 123, 124], 
                   'reviews': [20, 30, 23], 
                   'rating': [4, 2, 2]})

print (df)
  category  overallrating  rating  reviews  skunumber
0     Cat1              1       4       20        123
1     Cat1              5       2       30        123
2     cat1              3       2       23        124
通过在
重置
之前创建新的
索引
(此处为
skunumber
类别
)的列进行Nedd,并聚合一些函数,如
平均值
总和
最大值
最小值
第一值

df = df.rename(columns={'overallrating':'rating'})
tidy = df.groupby(['skunumber','category'])['rating'].max().unstack().reset_index()
print (tidy)
   skunumber category  rating  rating
0        123     Cat1       5       4
1        124     cat1       3       2
按注释编辑:

如果重复项需要一些聚合函数,如
max
first
sum
mean
groupby

print (df)
   skunumber category  overallrating  rating  reviews  color colorShade
0        123     Cat1              1       1       12  White        Red
1        123     Cat1              1       4       20   Pink      Green
2        124     cat1              2       2       23  Black       Blue

df = df.rename(columns={'overallrating':'rating', 'colorShade':'color'})
g = df.groupby(['skunumber','category'])

tidy1 = g['rating'].max().unstack()
print (tidy1)
                    rating  rating
skunumber category                
123       Cat1           1       4
124       cat1           2       2

tidy2 = g['color'].first().unstack()
print (tidy2)
                    color color
skunumber category             
123       Cat1      White   Red
124       cat1      Black  Blue
然后将
concat
数据放在一起:

df = pd.concat([tidy1, tidy2],axis=1).reset_index()
print (df)
   skunumber category  rating  rating  color color
0        123     Cat1       1       4  White   Red
1        124     cat1       2       2  Black  Blue
另一个带有pd.lreshape的解决方案

tidy = pd.lreshape(df, {'rating':['rating','overallrating'], 'color':['color','colorShade']})
print (tidy)
  category  reviews  skunumber  color  rating
0     Cat1        1        123  White       1
1     Cat1       20        123   Pink       4
2     cat1       23        124  Black       2
3     Cat1        1        123    Red       1
4     Cat1       20        123  Green       1
5     cat1       23        124   Blue       2

tidy = tidy.drop_duplicates(['category','skunumber'])
print (tidy)
  category  reviews  skunumber  color  rating
0     Cat1        1        123  White       1
2     cat1       23        124  Black       2

我认为您需要在中的参数
id\u vars
中添加另一列:

另一个更简单的解决方案是(默认情况下只保留
第一个
值)和最后一个:

如果使用真实数据,您可以轻松获得:

ValueError:索引包含重复的条目,无法重塑

然后,解决方案如下或另一个答案:

df = pd.DataFrame({'category': ['Cat1', 'Cat1', 'cat1'],
                   'overallrating': [1, 5, 3], 
                   'skunumber': [123, 123, 124], 
                   'reviews': [20, 30, 23], 
                   'rating': [4, 2, 2]})

print (df)
  category  overallrating  rating  reviews  skunumber
0     Cat1              1       4       20        123
1     Cat1              5       2       30        123
2     cat1              3       2       23        124
通过在
重置
之前创建新的
索引
(此处为
skunumber
类别
)的列进行Nedd,并聚合一些函数,如
平均值
总和
最大值
最小值
第一值

df = df.rename(columns={'overallrating':'rating'})
tidy = df.groupby(['skunumber','category'])['rating'].max().unstack().reset_index()
print (tidy)
   skunumber category  rating  rating
0        123     Cat1       5       4
1        124     cat1       3       2
按注释编辑:

如果重复项需要一些聚合函数,如
max
first
sum
mean
groupby

print (df)
   skunumber category  overallrating  rating  reviews  color colorShade
0        123     Cat1              1       1       12  White        Red
1        123     Cat1              1       4       20   Pink      Green
2        124     cat1              2       2       23  Black       Blue

df = df.rename(columns={'overallrating':'rating', 'colorShade':'color'})
g = df.groupby(['skunumber','category'])

tidy1 = g['rating'].max().unstack()
print (tidy1)
                    rating  rating
skunumber category                
123       Cat1           1       4
124       cat1           2       2

tidy2 = g['color'].first().unstack()
print (tidy2)
                    color color
skunumber category             
123       Cat1      White   Red
124       cat1      Black  Blue
然后将
concat
数据放在一起:

df = pd.concat([tidy1, tidy2],axis=1).reset_index()
print (df)
   skunumber category  rating  rating  color color
0        123     Cat1       1       4  White   Red
1        124     cat1       2       2  Black  Blue
另一个带有pd.lreshape的解决方案

tidy = pd.lreshape(df, {'rating':['rating','overallrating'], 'color':['color','colorShade']})
print (tidy)
  category  reviews  skunumber  color  rating
0     Cat1        1        123  White       1
1     Cat1       20        123   Pink       4
2     cat1       23        124  Black       2
3     Cat1        1        123    Red       1
4     Cat1       20        123  Green       1
5     cat1       23        124   Blue       2

tidy = tidy.drop_duplicates(['category','skunumber'])
print (tidy)
  category  reviews  skunumber  color  rating
0     Cat1        1        123  White       1
2     cat1       23        124  Black       2
您需要集成多个对象,因为它是
索引
参数。但是,请注意,如果存在与这些指数集对应的重复值,则它们的聚合将产生默认情况下的平均值(
aggfunc=np.mean
)。如果要对这些值求和,需要通过提供
aggfunc=np.sum
来实现

piv_df = df.pivot_table(index=['skunumber', 'category'], columns=['attribute'], values=['attributeRawValue'])
piv_df.columns = piv_df.columns.droplevel(0)
piv_df.reset_index().rename_axis(None, 1)


要获取
df

data = StringIO(
'''
skunumber   category    overallrating   rating  reviews
123          Cat1          1             1        20
124          cat1          2             2        23
''')

df = pd.read_csv(data, delim_whitespace=True)
df = pd.melt(df, id_vars=['skunumber', 'category'], 
             var_name='attribute', value_name='attributeRawValue')
df.loc[df['attribute']=='overallrating', 'attribute'] = 'rating'
df.drop_duplicates()

您需要集成多个对象,因为它是
索引
参数。但是,请注意,如果存在与这些指数集对应的重复值,则它们的聚合将产生默认情况下的平均值(
aggfunc=np.mean
)。如果要对这些值求和,需要通过提供
aggfunc=np.sum
来实现

piv_df = df.pivot_table(index=['skunumber', 'category'], columns=['attribute'], values=['attributeRawValue'])
piv_df.columns = piv_df.columns.droplevel(0)
piv_df.reset_index().rename_axis(None, 1)


要获取
df

data = StringIO(
'''
skunumber   category    overallrating   rating  reviews
123          Cat1          1             1        20
124          cat1          2             2        23
''')

df = pd.read_csv(data, delim_whitespace=True)
df = pd.melt(df, id_vars=['skunumber', 'category'], 
             var_name='attribute', value_name='attributeRawValue')
df.loc[df['attribute']=='overallrating', 'attribute'] = 'rating'
df.drop_duplicates()


谢谢Jezrael,您的解决方案对我的样本数据起到了作用。我将尝试使用实际数据。Jezrael,我尝试使用我获得的实际数据“ValueError:Index包含重复条目,无法重塑”错误。我也尝试使用您提供的解决方案,但我有更多列,它们也是字符串列。不幸的是,您需要使用
取消堆栈
解决方案
groupby
,你能用更多的文本列来解释你的问题吗?请考虑我还有2个栏目以及评论和评论。颜色和色光。颜色colorShade 123红色红色124蓝色谢谢Jezrael,您的解决方案对我的样本数据有效。我将尝试使用实际数据。Jezrael,我尝试使用我获得的实际数据“ValueError:Index包含重复条目,无法重塑”错误。我也尝试使用您提供的解决方案,但我有更多列,它们也是字符串列。不幸的是,您需要使用
取消堆栈
解决方案
groupby
,你能用更多的文本列来解释你的问题吗?请考虑我还有2个栏目以及评论和评论。颜色和色光。color colorShade 123 Red Red 124 blue blue BLUES解决方案也适用于副本,但我认为重要的是要注意默认聚合函数
mean
@jezrael,好主意!我在我的帖子中添加了一个小注释。Nickil,我也尝试过使用你的步骤,但我没有得到所需的输出。我得到了DataError:没有数字类型来聚合错误。你需要提供
参数来使用
aggfunc
(默认值)。请参阅editSolution,它也可以处理重复项,但我认为重要的是注意默认聚合函数
mean
@jezrael,很好!我在我的帖子中添加了一个小注释。Nickil,我也尝试过使用你的步骤,但我没有得到所需的输出。我得到了DataError:没有数字类型来聚合错误。你需要提供
参数来使用
aggfunc
(默认值)。参见编辑