当前位置: 首页 > 面试题库 >

pandas长到宽大的形状,有两个变量

易祖鹤
2023-03-14
问题内容

我有长格式的数据,正尝试将其整形为宽,但似乎没有一种简单的方法可以使用melt / stack / unstack来做到这一点:

Salesman  Height   product      price
  Knut      6        bat          5
  Knut      6        ball         1
  Knut      6        wand         3
  Steve     5        pen          2

成为:

Salesman  Height    product_1  price_1  product_2 price_2 product_3 price_3  
  Knut      6        bat          5       ball      1        wand      3
  Steve     5        pen          2        NA       NA        NA       NA

我认为Stata可以使用reshape命令执行类似的操作。


问题答案:

一个简单的枢轴可能足以满足您的需求,但这是我为再现您期望的输出所做的:

df['idx'] = df.groupby('Salesman').cumcount()

仅在组内计数器/索引内添加即可获得大部分的信息,但列标签将不会如您所愿:

print df.pivot(index='Salesman',columns='idx')[['product','price']]

        product              price        
idx            0     1     2      0   1   2
Salesman                                   
Knut         bat  ball  wand      5   1   3
Steve        pen   NaN   NaN      2 NaN NaN

为了更接近您想要的输出,我添加了以下内容:

df['prod_idx'] = 'product_' + df.idx.astype(str)
df['prc_idx'] = 'price_' + df.idx.astype(str)

product = df.pivot(index='Salesman',columns='prod_idx',values='product')
prc = df.pivot(index='Salesman',columns='prc_idx',values='price')

reshape = pd.concat([product,prc],axis=1)
reshape['Height'] = df.set_index('Salesman')['Height'].drop_duplicates()
print reshape

         product_0 product_1 product_2  price_0  price_1  price_2  Height
Salesman                                                                 
Knut           bat      ball      wand        5        1        3       6
Steve          pen       NaN       NaN        2      NaN      NaN       5

编辑:如果您想将程序推广到更多变量,我想您可以做以下事情(尽管可能效率不高):

df['idx'] = df.groupby('Salesman').cumcount()

tmp = []
for var in ['product','price']:
    df['tmp_idx'] = var + '_' + df.idx.astype(str)
    tmp.append(df.pivot(index='Salesman',columns='tmp_idx',values=var))

reshape = pd.concat(tmp,axis=1)

@路加说:

我认为Stata可以使用reshape命令执行类似的操作。

您可以,但我认为您还需要一个组内计数器,以重新配置状态以获得所需的输出:

     +-------------------------------------------+
     | salesman   idx   height   product   price |
     |-------------------------------------------|
  1. |     Knut     0        6       bat       5 |
  2. |     Knut     1        6      ball       1 |
  3. |     Knut     2        6      wand       3 |
  4. |    Steve     0        5       pen       2 |
     +-------------------------------------------+

如果添加,idx则可以在中进行重塑stata

reshape wide product price, i(salesman) j(idx)


 类似资料:
  • 详情请参阅 层次索引 和 改变形状。 Stack In [95]: tuples = list(zip(*[['bar', 'bar', 'baz', 'baz', ....: 'foo', 'foo', 'qux', 'qux'], ....: ['one', 'two', 'one', 'two',

  • 我有一个网格窗格的圆圈,我希望能够将一个圆圈拖到另一个圆圈之上,并将第一个圆圈的颜色应用于第二个圆圈。 我遇到的问题是,我无法让目标圆检测到dragEntered或dragOver。我已经能够使用标签成功地实现这一点,但由于某些原因,圆圈不会产生相同的效果。 我见过一些准解决方案,涉及设置circle.setMouseTransparent(true),以便被拖动节点下的节点可以看到拖动,但这里也

  • 有没有一个简单的算法可以实时使用,能够在没有任何用户输入的情况下变形两幅图像(完全自动,没有控制点可设置)? 基本上,我不想变形人脸或真实场景,这些图像实际上是完全抽象的,是绘画模式与线条等规则形状的组合。 提前谢谢。

  • 问题内容: 考虑以下代码: 这是相当难看,我想用开关的情况下,但我该如何使用与变量? 谢谢 问题答案: 您可以使用枚举来做所有事情。我为前两个值创建了示例,其余内容可以继续。 因此,您可以致电:

  • 我创建了条形图的简单示例,但我注意到条形图的大小适合图表。我怎样才能限制尺寸?我想限制宽度大小。

  • 我必须做一个形状工具箱,有一个正方形,矩形,圆形和三角形。基本上,用户输入形状,然后长度,高度,周长等,程序将输出形状本身,加上文字,表示长度,宽度,面积,周长等。我已经有了square类在一些帮助下,从你们这些了不起的人,现在我正在处理矩形类,遇到了一个问题。我将在这里发布我的主要方法和我的矩形类,我也将发布我的square类作为参考,因为它工作完美。我得到的是公共矩形框(int宽)。当squa

  • 我正在用php和ajax创建一个消息传递站点。 获取对话有问题。 问题是,每当两个用户在他们之间聊天时,就会有两个id不同的行; A和B正在聊天,彼此只写了4条消息 消息数据库是这样的 我的目标是用这个代码获取记录 $页面所有者是登录的用户; 使用这种方法,我可以进行两次相同的对话 a 代码在页面上给了我两次对话,我只想得到一个结果; 我的整个php代码是这样的