Unstack (pivot?) dataframe in Pandas



我有一个类似这样的数据框架:

ID | Relationship | First Name | Last Name |     DOB     |     Address   |    Phone
0 | 2 |     Self     |   Vegeta   |  Saiyan   |  01/01/1949 | Saiyan Planet | 123-456-7891
1 | 2 |     Spouse   |   Bulma    |  Saiyan   |  04/20/1969 | Saiyan Planet | 123-456-7891
2 | 3 |     Self     |   Krilin   |  Human    |  08/21/1992 | Planet Earth  | 789-456-4321
3 | 4 |     Self     |   Goku     |  Kakarot  |  05/04/1975 | Planet Earth  | 321-654-9870
4 | 4 |     Child    |   Gohan    |  Kakarot  |  04/02/2001 | Planet Earth  | 321-654-9870
5 | 5 |     Self     |   Freezer  |  Fridge   |  09/15/1955 |  Deep Space   | 456-788-9568

我希望将具有相同ID的行附加到具有该ID的第一行的右侧。

的例子:

ID | Relationship | First Name | Last Name |     DOB     |     Address   |    Phone     |  Spouse_First Name |  Spouse_Last Name  |  Spouse_DOB  |  Child_First Name  |  Child_Last Name  |   Child_DOB   |
0 | 2 |     Self     |   Vegeta   |  Saiyan   |  01/01/1949 | Saiyan Planet | 123-456-7891 |      Bulma         |        Saiyan      |   04/20/1969 |                    |                   |
1 | 3 |     Self     |   Krilin   |  Human    |  08/21/1992 | Planet Earth  | 789-456-4321 |                    |                    |              |                    |                   |
2 | 4 |     Self     |   Goku     |  Kakarot  |  05/04/1975 | Planet Earth  | 321-654-9870 |                    |                    |              |        Gohan       |      Kakarot      |   04/02/2001  | 
3 | 5 |     Self     |   Freezer  |  Fridge   |  09/15/1955 |  Deep Space   | 456-788-9568 |                    |                    |              |                    |                   |

我的实际场景数据框架有更多列,但是当两行共享相同的ID时,它们都具有相同的信息,因此不需要复制其他行中的信息。我只需要在右侧添加我选择的列,在这种情况下,这将是First Name, Last Name, DOB与新列标签的标识符,这取决于"关系"列上的内容(我可以在以后重命名它们,如果不可能以直接的方式做到,只是想说明我的观点。

既然我已经说过了,我想补充说,我已经尝试了不同的方法,似乎接近unstackpivot是要走的路,但我没有成功地使它工作。

任何帮助都将是非常感激的。

此解决方案假设DataFrame是由ID列索引的。

not_self = (
df.query("Relationship != 'Self'")
.pivot(columns='Relationship')
.swaplevel(axis=1)
.reindex(
pd.MultiIndex.from_product(
(
set(df['Relationship'].unique()) - {'Self'}, 
df.columns.to_series().drop('Relationship')
)
),
axis=1
)
)
not_self.columns = [' '.join((a, b)) for a, b in not_self.columns]
result = df.query("Relationship == 'Self'").join(not_self)

如果这不是我想要的,请告诉我。

相关内容

  • 没有找到相关文章

最新更新