簡體   English   中英

將熊貓數據框的一行轉換為多行

[英]Convert one row of a pandas dataframe into multiple rows

我想轉這個:

   age  id  val
0   99   1  0.3
1   99   2  0.5
2   99   3  0.1

進入這個:

   age  id  val
0   25   1  0.3
1   50   1  0.3
2   75   1  0.3
3   25   2  0.5
4   50   2  0.5
5   75   2  0.5
6   25   3  0.1
7   50   3  0.1
8   75   3  0.1

上下文:我的數據存儲了一個為所有年齡(年齡 = 99)編碼的值。 但是,我正在為其開發的應用程序需要為每個 id-age 對(id = 1,age = 25,50 和 75)明確規定的值。 對此有簡單的解決方案:遍歷 id 並附加一堆數據幀,但我正在尋找一些優雅的東西。 我想做一個多:一個從我的原始數據框合並到一個包含所有年齡的模板,但我仍然需要遍歷 id 來創建模板。

不知道,也許會有更優雅的方法,但是您可以執行諸如交叉聯接(或笛卡爾積 )的操作:

>>> df = pd.DataFrame({'age':[99,99,99],'id':[1,2,3],'val':[0.3,0.5,0.1]})
>>> df
   age  id  val
0   99   1  0.3
1   99   2  0.5
2   99   3  0.1
>>> df2 = pd.DataFrame({'age':[99,99,99],'new_age':[25,50,75]})
>>> df2 = pd.merge(df, df2, on='age')
>>> del df2['age']
>>> df2 = df2.rename(columns={'new_age':'age'})
>>> df2
   id  val      age
0   1  0.3       25
1   1  0.3       50
2   1  0.3       75
3   2  0.5       25
4   2  0.5       50
5   2  0.5       75
6   3  0.1       25
7   3  0.1       50
8   3  0.1       75

如果 Pandas >= 1.2 版本

import pandas as pd 

pd.__version__
# '1.2.0'

left = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
right = pd.DataFrame({'col3': [5, 6]}) 

left.merge(right, how='cross')

   col1  col2  col3
0     1     3     5
1     1     3     6
2     2     4     5
3     2     4     6

如果熊貓 < 1.2

df1.assign(key=1).merge(df2.assign(key=1), on="key").drop("key", axis=1)

暫無
暫無

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

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