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,并将其设置为轴索引