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
(默认值)。参见编辑