Python 仅通过熊猫中的两列重塑形状

Python 仅通过熊猫中的两列重塑形状,python,pivot-table,reshape,Python,Pivot Table,Reshape,这应该是一个简单的问题,但我想我只是错过了我应该搜索的关键字 假设我有一个两列长的数据集,如下所示: test = pd.DataFrame( { 'color': ['white', 'white', 'white', 'red', 'red', 'red', 'black', 'black', 'black'], 'value': [1,2,3,4,5,

这应该是一个简单的问题,但我想我只是错过了我应该搜索的关键字

假设我有一个两列长的数据集,如下所示:

test = pd.DataFrame(
       {
          'color': ['white', 'white', 'white', 
                    'red', 'red', 'red', 
                    'black', 'black', 'black'],
           'value': [1,2,3,4,5,6,7,8,9]
       })
如何将其转换为以下格式:

    white   red    black
    1        4       7
    2        5       8 
    3        6       9 
我意识到这应该是一个简单的枢轴函数,如:

test.pivot('color','value')
,但这会产生与周围NaN成对角线的值。这有什么办法吗

试试看:

test[“id”]=test.groupby(“color”)[“color”].cumcount()
测试数据透视(index=“id”、columns=“color”、values=“value”)
产出:

黑-红-白
身份证件
0          7    4      1
1          8    5      2
2          9    6      3

我使用pandas库中的groupby函数完成了一些快速解决方案

 for i in test.groupby('color'):
     print(i[0])
     for j in range(len(i[1])):
         for k in i[1].values:
             print(k[1])
         break 
输出:

black
7
8 
9
red
4  
5
6
white
1
2
3

您可以从3个系列中创建系列、重置索引和重新创建数据帧:

df = pd.DataFrame({'color': ['white', 'white', 'white', 'red', 'red', 'red', 'black', 'black', 'black'],
'value': [1,2,3,4,5,6,7,8,9]})

serie_white = df['value'][df['color'] == "white"].reset_index(drop=True)
serie_red = df['value'][df['color'] == "red"].reset_index(drop=True)
serie_black = df['value'][df['color'] == "black"].reset_index(drop=True)

result = pd.DataFrame({'white': serie_white, 'red': serie_red, 'black': serie_black})
print(result)
输出:

   white  red  black
0      1    4      7
1      2    5      8
2      3    6      9

真是个巫师!如果您不介意的话-为什么这比我手动生成一个新id(例如一个适当长的np.arange())更有效?或者,如果你还记得的话,你是从哪里学会这个把戏的?我到处搜索,在我的情况下似乎找不到很多问题(或者可能是我使用了错误的关键字…)哈哈,很高兴它成功了:)所以-你需要使用
cumcount()
groupby(…)
(所以它将分别计算每个组)来获得正确的id-否则就像你说的那样-你将得到一个对角线。它只是将行号按其出现的顺序分配给组中的每个事件。问题是,每行中的值之间没有逻辑联系,混合其中一列的顺序也同样有意义,因此,如果您知道显示的每个颜色的数量是3,则创建一列重复1,2,3,并将其设置为轴索引