簡體   English   中英

將其他子集用作分組變量時,在Pandas DataFrame中轉置列的子集?

[英]Transposing a subset of columns in a Pandas DataFrame while using others as grouping variable?

假設我有一個Pandas數據框(已經是數據框格式):

x = [[1,2,8,7,9],[1,3,5.6,4.5,4],[2,3,4.5,5,5]]
df = pd.DataFrame(x, columns=['id1','id2','val1','val2','val3'])

id1 id2 val1 val2 val3
1   2   8.0  7.0  9
1   3   5.6  4.5  4
2   3   4.5  5.0  5

我希望在一列中使用val1val2val2 ,其中id1id2作為分組變量。 我可以使用這個極其復雜的代碼:

dfT = df.iloc[:,2::].T.reset_index(drop=True)
n_points = dfT.shape[0]
final = pd.DataFrame()
for i in range(0, df.shape[0]):
    data = np.asarray([[df.ix[i,'id1']]*n_points, 
                      [df.ix[i,'id2']]*n_points,
                      dfT.ix[:,i].values]).T
    temp = pd.DataFrame(data, columns=['id1','id2','val'])
    final = pd.concat([final, temp], axis=0)

將我的數據框設置為正確的格式:

    id1 id2 val
0   1.0 2.0 8.0
1   1.0 2.0 7.0
2   1.0 2.0 9.0
0   1.0 3.0 5.6
1   1.0 3.0 4.5
2   1.0 3.0 4.0
0   2.0 3.0 4.5
1   2.0 3.0 5.0
2   2.0 3.0 5.0

但必須有一種更有效的方法來執行此操作,因為在大型數據幀上,此過程花費的時間太長。

建議?

您可以使用帶有drop column variable melt

print (pd.melt(df, id_vars=['id1','id2'], value_name='val')
         .drop('variable', axis=1))

   id1  id2  val
0    1    2  8.0
1    1    3  5.6
2    2    3  4.5
3    1    2  7.0
4    1    3  4.5
5    2    3  5.0
6    1    2  9.0
7    1    3  4.0
8    2    3  5.0

使用set_indexstack另一種解決方案:

print (df.set_index(['id1','id2'])
         .stack()
         .reset_index(level=2, drop=True)
         .reset_index(name='val'))

   id1  id2  val
0    1    2  8.0
1    1    2  7.0
2    1    2  9.0
3    1    3  5.6
4    1    3  4.5
5    1    3  4.0
6    2    3  4.5
7    2    3  5.0
8    2    3  5.0

甚至可以使用lreshape來完成一個更簡單的操作(雖然尚未記錄):

pd.lreshape(df, {'val': ['val1', 'val2', 'val3']}).sort_values(['id1', 'id2'])

圖片

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM