簡體   English   中英

熊貓數據框將行合並為列

[英]pandas dataframes merging rows into columns

我有 2 個熊貓數據幀(df1,df2),我試圖從中提取數據並創建第三個數據幀(df3)

df1 有 2 列(一個 id 列和另一列保存第二個數據幀(df2)中列的名稱

df1 looks like:
===============
id1      name
---      ----
1        df2_column1_name
5        df2_column1_name
33       df2_column3_name
...
... and so on

df2 looks like:
===============
id2  df2_column1_name   df2_column2_name   df2_column2_name .... and so on
---  ----------------   ----------------   ----------------
12   Jimmy              male               25               .... 
16   Becky              female             30               ....
75   Mike               male               80               ....
....
.... and so on


I am trying to create df3 to look like:
=======================================
column1  Column2  Column3
-------  -------  -------
1        12       Jimmy    
5        12       male 
33       12       25
.
.
1        16       Becky
5        16       female
33       16       30
.
.
1        75       Mike
5        75       male
33       75       80
.
.
.

數據幀可能非常大。 如果可能的話,我試圖找出最有效的方法來做到這一點,而無需雙循環。 請建議最好的方法來做到這一點。 謝謝

堆棧和合並可以讓您完成大部分工作:

In [11]: df2.set_index("id2").stack().reset_index(name='value')
Out[11]:
   id2           level_1   value
0   12  df2_column1_name   Jimmy
1   12  df2_column2_name    male
2   12  df2_column3_name      25
3   16  df2_column1_name   Becky
4   16  df2_column2_name  female
5   16  df2_column3_name      30
6   75  df2_column1_name    Mike
7   75  df2_column2_name    male
8   75  df2_column3_name      80

In [12]: df2.set_index("id2").stack().reset_index(name='value').merge(df1, right_on="name", left_on="level_1")
Out[12]:
   id2           level_1   value  id1              name
0   12  df2_column1_name   Jimmy    1  df2_column1_name
1   16  df2_column1_name   Becky    1  df2_column1_name
2   75  df2_column1_name    Mike    1  df2_column1_name
3   12  df2_column2_name    male    5  df2_column2_name
4   16  df2_column2_name  female    5  df2_column2_name
5   75  df2_column2_name    male    5  df2_column2_name
6   12  df2_column3_name      25   33  df2_column3_name
7   16  df2_column3_name      30   33  df2_column3_name
8   75  df2_column3_name      80   33  df2_column3_name

最后,您必須僅選擇所需的列並進行排序:

In [13]: df2.set_index("id2").stack().reset_index(name='value').merge(df1, right_on="name", left_on="level_1")[["id1", "id2", "value"]].sort_v
     ...: alues("id2")
Out[13]:
   id1  id2   value
0    1   12   Jimmy
3    5   12    male
6   33   12      25
1    1   16   Becky
4    5   16  female
7   33   16      30
2    1   75    Mike
5    5   75    male
8   33   75      80

暫無
暫無

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

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